javascript - 如何存根从另一个函数调用的模块函数
问题描述
我的module.ts
文件有 2 个功能:
export async function foo() {
var barVal = await bar();
doSomethingWithBarVal(barVal);
}
export async function bar(): Bar {
return await somethingAsync();
}
在我的测试中,我想stub
bar() 并返回一个mock
for Bar
(的返回值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
在模块范围内使用可用。
要解决此问题,您有几个选择。
1. 又快又脏
使用exports.bar
而不是bar
在foo
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
推荐阅读
- java - 更新查询多行
- javascript - 如何仅提取没有整个匹配的组作为 String.match() 的输出?
- laravel-5 - 使用 Spipu\Html2Pdf 转换图像时出错
- python - Python 脚本无法使用 Cronjob 运行,但从浏览器执行
- java - 在模型映射中跳过源字段
- json - 如何从 WCF Web 服务返回 JSON?
- tomcat - 如何将数据源从 jboss Standalone.xml 迁移到 tomcat 9
- php - 数组 - php错误排序
- c# - Web 套接字消息大小标头
- php - 带参数的 MS Access 查询不适用于 php / sql