编程语言
首页 > 编程语言> > javascript – 测试一个函数使用Sinon.js调用ES6模块中的另一个函数

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

作者:互联网

我想测试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做的事情做一些基本的断言,但我显然不希望这样做.

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

解决方法:

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

执行代码时,函数栏内的baz引用将针对本地实现进行解析.您无法修改,因为在模块代码之外,无法访问内部.

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

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

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

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

export default obj;

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

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

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

标签:javascript,ecmascript-6,sinon
来源: https://codeday.me/bug/20190930/1836891.html