测试函数使用Sinon.js调用ES6模块中的另一个函数

kur*_*ink 10 javascript sinon ecmascript-6

我想测试ES6模块中的函数使用Sinon.js调用另一个函数.这是我正在做的基本布局:

foo.js

export function bar() {
 baz();
}

export function baz() {
 ...
}
Run Code Online (Sandbox Code Playgroud)

test.js

import sinon from 'sinon';
import * as Foo from '.../foo';

describe('bar', function() {
  it('should call baz', function() {
    let spy = sinon.spy(Foo, 'baz');
    spy.callCount.should.eql(0);

    Foo.bar();

    spy.calledOnce.should.eql(true);
  });
}); 
Run Code Online (Sandbox Code Playgroud)

但间谍没有接听电话baz().还有其他方法我可以设置模块或测试以允许sinon选择它吗?我的另一种选择是对baz做的事情做一些基本的断言,但我显然不希望这样做.

从我在网上看到的情况来看,我想知道是否可以使用现有代码或者我需要对其进行重组以获得我想要的内容.

Ami*_*mit 12

你认为模块目前的结构方式是不可能的,你是对的.

执行代码时,baz内部引用function bar将根据本地实现进行解析.您无法修改,因为在模块代码之外,无法访问内部.

可以访问导出的属性,但不能突变这些,所以你不能影响模块.

改变它的一种方法是使用这样的代码:

let obj = {};
obj.bar = function () {
 this.baz();
}

obj.baz = function() {
 ...
}

export default obj;
Run Code Online (Sandbox Code Playgroud)

现在,如果您baz在导入的对象中覆盖,则会影响内部bar.

话虽如此,感觉非常笨重.存在其他控制行为的方法,例如依赖注入.

此外,你应该考虑你是否真正关心是否baz被召唤.在标准的"黑盒测试"中,你不关心某些事情是如何完成的,你只关心它产生的副作用.为此,测试您预期的副作用是否发生以及没有其他任何事情发生.