我有一个模块,它实例化导入的类并异步调用这些实例的方法。
如何根据每个测试用例独立地模拟这些方法,以便这些模拟仅在测试用例中创建,因为我无法在测试结束时可靠地恢复模拟?
示例:
// tested class
import B from './b';
import C from './c';
export default class A {
someFunction() {
let instanceB = new B();
return instanceB.doSomething()
.then(() => this.doSomethingElse())
.then((data) => {
// async context, other tests will start before this.
let instanceC = new C(data);
});
}
}
// test
import A from './a';
describe('test', () => {
it('case1', () => {
a = new A();
// Mock B, C with config1
return a.someFunction().then(() => {/* asserts1 */ });
})
it('case2', () => {
a = new A();
// Mock B, C with config2
return a.someFunction().then(() => {/* asserts2 */ });
})
})
如果我在case1中模拟B和C并同步恢复它们,那么C&#39的配置将被覆盖,因为case2在异步上下文中的C实例化之前运行。 出于同样的原因,我无法在asserts1之后异步恢复模拟。
有类似的问题:Stubbing a class method with Sinon.js,How to mock dependency classes for unit testing with mocha.js? 但他们没有解决异步模拟的问题。
答案 0 :(得分:0)
所以我最终得到(不太漂亮)构造函数注入。如果您有更好的方法,包括可能采用完全不同的方法来测试和编写异步工厂,请分享,我很乐意接受
MyRoute