在Jest中测试事件监听器的最简单方法是什么?

4

我正在尝试测试以下函数

 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测试: // 在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);
 });

我期望process()函数被调用10次,因为数据被发送了10次。但是当我进行断言时,只有2次被调用。但是当我在函数内部添加console.log并运行测试时,它会被调用10次。我不确定出了什么问题。感激任何帮助。
1个回答

8
问题是调用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!
});

我看到上面的代码出现了 TypeError: Cannot read property '1' of undefined。 - user2821242
你需要一个间谍来监听 test.on...然后 .mock.calls[0][1] 就是你的回调函数了。@user2821242 - Brian Adams
如果您更新问题并展示test如何被导入到您的代码文件中,我可以提供更完整的答案以帮助您。@user2821242 - Brian Adams
实际上你建议的方法有效。是我自己的问题。那么如何处理“error”呢?如果你看一下上面的代码,会发现有test.on('data'...)和test.on('error')。虽然这个方法有效,但我还是有点困惑。我不太清楚为什么onSpy.mock.calls[0][1]。你能再解释一下吗?我已经更新了上面的代码,包括process()函数。 - user2821242
“error”回调函数将作为第二个参数传递给第二次调用“test.on”,因此您可以通过“.mock.calls [1] [1]”从间谍中获取它。 - Brian Adams
.mock.calls 提供了“一个包含所有调用该模拟函数的调用参数的数组”。 - Brian Adams

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接