javascript - 开玩笑地测试事件侦听器的最简单方法是什么?
问题描述
我正在尝试测试以下功能
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=>{.....})
};
开玩笑测试://在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 次。
我不确定出了什么问题。感谢任何帮助。
解决方案
问题是调用实际上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!
});
推荐阅读
- android - 使用 bundle 启动活动时如何使用 ActivityTestRule?
- python - 为每个过滤器 Python 创建多个新数据表
- c# - .Net Core 2 MVC Web App 中的 OpenID 识别
- c++ - 如何在具有依赖关系的 qbs 产品之间强制同步?
- android - HashMap 为空,因此我无法从 Firebase 数据库获取模拟器中显示的数据
- javascript - Autoprefixer 导致 node-sass 源映射指向错误的文件
- react-native - 来自 json GPS API 的 React Native 动态更新状态
- unity3d - AR 放置一个大小相同的物体
- mysql - mysql查询select sum where子句
- c# - C# - 你能做一组正则表达式搜索模式吗?