我的module.ts
文件具有2个功能:
export async function foo() {
var barVal = await bar();
doSomethingWithBarVal(barVal);
}
export async function bar(): Bar {
return await somethingAsync();
}
在测试中,我想stub
bar()并为mock
返回Bar
(返回值bar()
)
我当前的测试如下:
var module = require('module.ts');
var myStub = sinon.stub(module, 'bar').resolves(myMock);
await foo();
expect(myStub.calledOnce);
但是,expect
总是失败,并且会调用'real'bar()
。
如果我直接从测试中调用bar()
,那么存根被称为,但是我想测试整个流程。
答案 0 :(得分:2)
您的方法存在的问题是您正在对模块对象进行存根(exports
,因为您在测试中使用commonjs require
),而您的foo
函数使用了可用的bar
在模块范围内。
要解决此问题,您可以在此处选择几个选项。
在exports.bar
中使用bar
代替foo
export async function foo() {
var barVal = await exports.bar();
doSomethingWithBarVal(barVal);
}
这种方法实际上是一种利用您的模块将被转换为commonjs格式的事实的黑客。有朝一日可能不是真的,但现在可以使用。
拥抱ES模块是静态的事实。通过明确允许将bar
指定为其参数,使函数“可再次测试”
export async function foo(_bar = bar) {
var barVal = await _bar();
doSomethingWithBarVal(barVal);
}
// test.js
await foo(mockBarImplementation)
使用一些IoC/DI
实现。例如typescript-ioc