[英]How to stub a module function that is called from another function
我的module.ts
文件有两个功能:
export async function foo() {
var barVal = await bar();
doSomethingWithBarVal(barVal);
}
export async function bar(): Bar {
return await somethingAsync();
}
在我的测试中,我想stub
bar() 并返回Bar
的mock
( bar()
的返回值)
我目前的测试是这样的:
var module = require('module.ts');
var myStub = sinon.stub(module, 'bar').resolves(myMock);
await foo();
expect(myStub.calledOnce);
但是, expect
总是失败,并且调用了“真正的” bar()
。
如果我直接从我的测试中调用bar()
,则会调用存根,但我想测试整个流程。
您的方法的问题在于您正在存根模块对象( exports
因为您在测试中使用的是 commonjs require
),而您的foo
函数使用模块范围内的bar
可用。
要解决此问题,您有几个选择。
在foo
使用exports.bar
而不是bar
export async function foo() {
var barVal = await exports.bar();
doSomethingWithBarVal(barVal);
}
这种方法实际上是一种 hack,它利用了您的模块将被转换为 commonjs 格式这一事实。 这可能有一天不是真的,但现在有点工作。
接受 ES 模块是静态的这一事实。 通过明确允许将bar
指定为其参数,使您的函数“再次可测试”
export async function foo(_bar = bar) {
var barVal = await _bar();
doSomethingWithBarVal(barVal);
}
// test.js
await foo(mockBarImplementation)
使用一些IoC/DI
实现。 例如打字稿-ioc
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.