Javascript 在jest中测试事件侦听器最简单的方法是什么?

Javascript 在jest中测试事件侦听器最简单的方法是什么?,javascript,node.js,mocking,jestjs,event-listener,Javascript,Node.js,Mocking,Jestjs,Event Listener,我正在尝试测试下面的函数 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.l

我正在尝试测试下面的函数

 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=>{.....})
};
玩笑测试: //在之前

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);
 });
我希望
process()
调用10次,因为数据发送了10次。然而,当我断言它时,它只被调用了2次,但是当我在函数本身中放入一个console.log并运行测试时,它被调用了10次


我不知道怎么了。谢谢你的帮助

问题是在
xyz.getVal
上调用
await
实际上没有任何作用,因为
getVal
是一个同步函数,它只设置事件侦听器

…因此,当
expect
运行并失败时,异步事件尚未完成处理


看起来你已经在
test.on
上找到了间谍

与其模仿它的实现,不如使用它来获取回调函数

然后您可以直接调用并等待回调函数:

  // 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!
});
//在每个之前
mockData=[包含10个值的数组]
onSpy=jest.fn();
它('每个消息应该触发一次回调',异步()=>{
xyz.getVal(过程);

const callback=onSpy.mock.calls[0][1];//我看到TypeError:无法读取上述未定义的属性“1”
测试需要一个间谍。在上,
.mock.calls[0][1]
将是您的回调函数。@user2821242如果您用更多的代码更新您的问题(显示如何将
测试
导入到您的代码文件中)如果有帮助的话,我可以创建一个更完整的答案。@user2821242实际上你的建议起了作用。我的错。我如何为“error”这样做?如果你在上面检查,它有test.on('data')和test.on('error')。尽管这样做有效,但我还是有点困惑。我不清楚为什么onSpy.mock.calls[0][1]。你能再解释一下吗?我已经用实际进程更新了上面的内容()
error
callback将是第二次调用
test.on
的第二个参数,因此你可以使用
.mock.calls[1][1]
@user2821242从spy获得它