繁体   English   中英

如何存根从另一个函数调用的模块函数

[英]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() 并返回Barmockbar()的返回值)

我目前的测试是这样的:

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可用。

要解决此问题,您有几个选择。

1.又快又脏

foo使用exports.bar而不是bar

export async function foo() {
    var barVal = await exports.bar();
    doSomethingWithBarVal(barVal);
}

这种方法实际上是一种 hack,它利用了您的模块将被转换为 commonjs 格式这一事实。 这可能有一天不是真的,但现在有点工作。

2. 拥抱 ES 模块的静态特性

接受 ES 模块是静态的这一事实。 通过明确允许将bar指定为其参数,使您的函数“再次可测试”

export async function foo(_bar = bar) {
    var barVal = await _bar();
    doSomethingWithBarVal(barVal);
}

// test.js
await foo(mockBarImplementation)

3.进阶

使用一些IoC/DI实现。 例如打字稿-ioc

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM