Javascript sinon监视回调

Javascript sinon监视回调,javascript,typescript,unit-testing,jestjs,sinon,Javascript,Typescript,Unit Testing,Jestjs,Sinon,我觉得我大致了解sinon是如何工作的,但我在监视传递给我正在测试的导入函数的回调时遇到了一些麻烦。下面是一个例子: 从“sinon”导入sinon const callbackCaller=(cb:(msg:string)=>void,msg:string)=>{ cb(`CallbackCaller调用${cb},${msg}`) } 描述('这似乎不对',()=>{ 它('应该通过但不通过',()=>{ 常量回调=(消息:字符串)=>{ log(`Callback called with$

我觉得我大致了解sinon是如何工作的,但我在监视传递给我正在测试的导入函数的回调时遇到了一些麻烦。下面是一个例子:

从“sinon”导入sinon
const callbackCaller=(cb:(msg:string)=>void,msg:string)=>{
cb(`CallbackCaller调用${cb},${msg}`)
}
描述('这似乎不对',()=>{
它('应该通过但不通过',()=>{
常量回调=(消息:字符串)=>{
log(`Callback called with${msg}`)
}
const callbackSpy=sinon.spy(回调)
callbackCaller(回调“tarfu”)
sinon.assert.called(callbackSpy)
})
})
运行时,此测试按预期打印,但断言失败:

$纱线测试:失败
纱线运行v1.21.1
$jest src/test.test.ts
src/test.test.ts失败
这似乎是错误的
✕ 应通过但未通过(8ms)
● 这似乎是错误的›应该通过,但没有通过
AssertError:预期至少调用了一次回调,但从未调用过
14 | 
15 | callbackCaller(回调“tarfu”)
>16 | sinon.assert.called(callbackSpy)
|                      ^
17 |     })
18 | })
19 | 
at Object.fail(../../../node_modules/sinon/lib/sinon/assert.js:107:21)
在failAssertion(../../../node_modules/sinon/lib/sinon/assert.js:66:16)
在Object.assert.(匿名函数)[按调用](../../../node_modules/sinon/lib/sinon/assert.js:92:13)
at Object.it(test.test.ts:16:22)
console.log src/test.test.ts:10
用CallbackCaller调用CallbackCaller调用(msg)=>{
log(`Callback called with${msg}`);
},塔夫
测试套件:1个失败,共1个
测试:1次失败,共1次
快照:共0个
时间:0.815s,估计1s
运行与/src\/test.test.ts/i匹配的所有测试套件。
错误命令失败,退出代码为1。
信息访问https://yarnpkg.com/en/docs/cli/run 有关此命令的文档。

请注意,回调确实正在被调用,正如它在stacktrace下方打印所示。我使用的是节点版本10.16和JEST25.1.0。由于回调是在失败后记录的,所以jest似乎在
callbackCaller
调用
cb
之前检查spy,但是没有异步的东西,所以我有点不知所措。希望解决方案不是“sinon不这样做,请使用其他工具”:

您应该将
callbackSpy
传递给
callbackCaller
函数,而不是原始的
callback
。因为
sinon
用间谍(
callbackspy
)包装
callbackspy
),以便您可以使用
sinon.assert.called
来断言它

index.test.ts

从“sinon”导入sinon;
const callbackCaller=(cb:(msg:string)=>void,msg:string)=>{
cb(`CallbackCaller调用${cb},${msg}`);
};
描述('这似乎不对',()=>{
它(“应该通过但不通过”,()=>{
常量回调=(消息:字符串)=>{
log(`Callback called with${msg}`);
};
const callbackSpy=sinon.spy(回调);
callbackCaller(callbackpy,'tarfu');
sinon.assert.called(callbackSpy);
});
});
单元测试结果:

这似乎是错误的
用Callback调用Callback调用Callback调用tarfu
✓ 应该通过但不通过
1次通过(6毫秒)