use*_*242 5 javascript mocking event-listener node.js jestjs
我正在尝试测试以下功能
getVal(process) {
test.on('data', async data => {
try {
for (const val of data) {
await process(val);
console.log('processed')
}} catch (e) {}
});
test.on('error', err => {
console.log('error', err)
});
}
process(payload) {
return new Promise(resolve=>{.....})
};
Run Code Online (Sandbox Code Playgroud)
玩笑测试: // 在 beforeEach 中
mockData =[an array containing 10 values]
onSpy = jest
.fn()
.mockImplementationOnce(async (data, callback) => {
callback(mockData);
})
.mockImplementationOnce((error, callback) => {
callback(mockErr);
});
it('should trigger callback once per message', async () => {
await xyz.getVal(process);
await expect(process).toHaveBeenCalledTimes(10);
});
Run Code Online (Sandbox Code Playgroud)
我预计 会process()被调用 10 次,因为数据发送了 10 次。然而,当我断言时,它仅被调用 2 次,但当我将 console.log 放入函数本身并运行测试时,它被调用 10 次。
我不确定出了什么问题。感谢任何帮助。
问题是,调用await实际上xyz.getVal并没有执行任何操作,因为getVal它是一个仅设置事件侦听器的同步函数......
...所以异步事件在运行和失败时尚未完成处理expect。
看起来你已经有间谍了test.on。
不用模拟它的实现,只需使用它来获取回调函数即可。
然后就可以await直接调用回调函数了:
// in beforeEach
mockData = [an array containing 10 values]
onSpy = jest.fn();
it('should trigger callback once per message', async () => {
xyz.getVal(process);
const callback = onSpy.mock.calls[0][1]; // <= get the callback (second argument of the first call to test.on)
await callback(mockData); // <= call and await the callback directly
expect(process).toHaveBeenCalledTimes(10); // Success!
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
28600 次 |
| 最近记录: |