问题描述
我使用 awilix 能够在 javascript 中进行依赖注入,以便能够更轻松地进行测试。但现在我想模拟一个在我的容器中设置的解析器,仅用于一组测试
换句话说,我有一个解析器,出于某些原因,我想在测试中模拟它(多次调用它的成本很高,而且网络调用很耗时。)因此,我需要模拟它在我的许多测试中,例如在名为 b.test.js 的测试中,但我希望它调用 a.test.js 中的实际函数
这是我的 awilix 配置
var awilix = require('awilix');
var container = awilix.createContainer({
injectionMode: awilix.InjectionMode.PROXY,});
var network = () => {
return new Promise((resolve,reject) => {
setTimeout(() => { resolve('data') },3000);
});
}
module.exports = container.register({ network: awilix.asValue(network) });
我的测试是
const container = require('../container');
container.register({
heavyTask: awilix.asValue(mockFunction),});
describe('b',() => {
it('b',async () => {
const result = await container.resolve('network')();
});
});
解决方法
不知何故你已经做到了
但是不要像您所做的那样配置容器,因为这样您将拥有容器的单个对象,因此如果您更改该对象,它将在所有测试中更改,而是这样做
const awilix = require('awilix');
const heavyTask = () => new Promise((resolve,reject) => {
setTimeout(() => {
resolve('actual run');
},3000);
});
const configContainer = () => {
const container = awilix.createContainer({
injectionMode: awilix.InjectionMode.PROXY,});
return container.register({
heavyTask: awilix.asValue(heavyTask),});
}
module.exports = configContainer;
您似乎已经知道您可以覆盖您的注册,这可能是唯一模糊的部分
所以 a.test.js 可以写成
const { describe,it } = require('mocha');
const { expect } = require('chai');
const configContainer = require('../container');
const container = configContainer();
describe('a',() => {
it('a',async () => {
const res = await container.resolve('heavyTask')();
expect(res).to.eq('actual run');
});
});
和测试 b 可以写成这样
const awilix = require('awilix');
const { describe,it } = require('mocha');
const { expect } = require('chai');
const configContainer = require('../container');
const container = configContainer();
const heavyTask = () => 'mock run';
container.register({
heavyTask: awilix.asValue(heavyTask),});
describe('b',() => {
it('b',async () => {
const res = await container.resolve('heavyTask')();
expect(res).to.eq('mock run');
});
});