gpt4 book ai didi

javascript - 如何 stub 从另一个函数调用的模块函数

转载 作者:搜寻专家 更新时间:2023-10-30 21:32:43 25 4
gpt4 key购买 nike

我的 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(),那么 stub 会被调用,但我想测试整个流程。

最佳答案

你的方法的问题是你正在 stub 模块对象(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 实现。例如typescript-ioc

关于javascript - 如何 stub 从另一个函数调用的模块函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56913354/

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