【问题标题】:Test that a function calls another function in an ES6 module with Sinon.js使用 Sinon.js 测试一个函数是否调用了 ES6 模块中的另一个函数
【发布时间】:2016-05-08 18:33:00
【问题描述】:

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

foo.js

export function bar() {
 baz();
}

export function baz() {
 ...
}

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);
  });
}); 

但是间谍没有接听baz() 的电话。有没有其他方法可以设置模块或测试以允许 sinon 拾取它?我的替代方法是对 baz 所做的事情做出一些基本断言,但我显然不想这样做。

根据我在网上看到的情况,我想知道按原样布局的代码是否可以实现这一点,或者我是否需要对其进行重组以获得我想要的。

【问题讨论】:

    标签: javascript ecmascript-6 sinon


    【解决方案1】:

    您的想法是正确的,这对于模块当前的结构方式是不可能的。

    当代码被执行时,function bar 中的baz 引用将针对本地实现进行解析。您无法修改它,因为在模块代码之外无法访问内部。

    您确实可以访问导出的属性,但您不能改变这些属性,因此您不能影响模块。

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

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

    现在,如果您在导入的对象中覆盖baz,您将影响bar 的内部结构。

    话虽如此,但感觉很笨拙。存在其他控制行为的方法,例如依赖注入。

    此外,您应该考虑是否真的关心是否调用了 baz。在标准的“黑盒测试”中,您不关心如何完成某件事,您只关心它产生了什么副作用。为此,请测试是否发生了您预期的副作用并且没有进行任何其他操作。

    【讨论】:

    • 感谢您的快速回复。我想了很多,并且觉得我必须采取更黑箱的方法。
    猜你喜欢
    • 2018-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-13
    • 2017-05-13
    • 1970-01-01
    • 2016-11-16
    • 1970-01-01
    相关资源
    最近更新 更多