[英]What is the easiest way to test event listeners in jest?
我正在尝试测试以下功能
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=>{.....})
};
Jest test:// in 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);
});
我希望自数据发送10次以来, process()
被调用10次。 但是当我断言时它只被调用了2次,但是当我在函数本身中放置一个console.log并运行测试时,它会被调用10次。
我不确定是什么问题。 感谢任何帮助。
问题是在xyz.getVal
上调用await
实际上并没有做任何事情,因为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!
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.