Sinon Stub / Spy在单元测试中的本地功能

时间:2017-09-08 20:28:01

标签: javascript unit-testing karma-runner sinon

我使用es6模块和Karma / Mocha / Sinon / Chai进行单元测试。如果我在另一个es6模块中调用了es6模块,我可以对第二个es6模块进行存根/间谍,如下所示:

模块a.js

export function a() {
     // do something
}

模块b.js

import * as moduleA from './module-a';

export function b() {
     // do something
     moduleA.a();
}

使用上面的代码,我可以监视moduleA.a()并确定它何时被调用和stub moduleA.a()并强制特定的返回值。

但是,如果我遇到这种情况,我就不能监视或存根:

模块a.js

export function a() {
     // do something
}

export function b() {
     // do something
     a();
}

如果我在这个例子中尝试间谍/存根函数a(),那么Sinon中的spy / stub永远不会被调用/这是一个非常常见的情况所以有人找到了间谍/存根本地函数的方法吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

我遇到了类似的问题,我使用以下方法添加默认导出,该导出是所有已命名函数导出的命名变量包装。然后,使用该默认导出对象引用为模块内函数调用添加前缀。在您的测试中,您可以导入默认导出,然后可以使用模块内函数调用存根,这些调用遵循存根行为:

// MyModule.js
let MyModule;

export function myfunc2() { return 2; }
export function myfunc1() { return MyModule.myfunc2(); }

export default MyModule = {
  myfunc1,
  myfunc2
}

// tests.js
import MyModule from './MyModule'

describe('MyModule', () => {
  const sandbox = sinon.sandbox.create();
  beforeEach(() => {
    sandbox.stub(MyModule, 'myfunc2').returns(4);
  });
  afterEach(() => {
    sandbox.restore();
  });
  it('myfunc1 is a proxy for myfunc2', () => {
    expect(MyModule.myfunc1()).to.eql(4);
  });
});