gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 02:38:24 25 4
gpt4 key购买 nike

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

foo.js

export function bar() {
baz();
}

export function baz() {
...
}

测试.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);
});
});

但是 spy 没有接听对 baz() 的调用。有没有其他方法可以设置模块或测试以允许 sinon 接收它?我的替代方案是对 baz 所做的事情做出一些基本断言,但我显然不想那样做。

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

最佳答案

您认为以模块当前的结构方式不可能做到这一点是对的。

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

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

一种改变方法是使用如下代码:

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

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

export default obj;

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

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

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

关于javascript - 使用 Sinon.js 测试一个函数调用 ES6 模块中的另一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35111367/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com