每个测试实例的模拟依赖类

时间:2017-10-19 10:26:34

标签: javascript asynchronous mocha sinon

我有一个模块,它实例化导入的类并异步调用这些实例的方法。

如何根据每个测试用例独立地模拟这些方法,以便这些模拟仅在测试用例中创建,因为我无法在测试结束时可靠地恢复模拟?

示例:

// 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.jsHow to mock dependency classes for unit testing with mocha.js? 但他们没有解决异步模拟的问题。

1 个答案:

答案 0 :(得分:0)

所以我最终得到(不太漂亮)构造函数注入。如果您有更好的方法,包括可能采用完全不同的方法来测试和编写异步工厂,请分享,我很乐意接受

MyRoute