【问题标题】:What is the easiest way to test event listeners in jest?开玩笑地测试事件侦听器的最简单方法是什么?
【发布时间】:2019-09-13 06:45:28
【问题描述】:

我正在尝试测试以下功能

 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 次。

我不确定出了什么问题。感谢任何帮助。

【问题讨论】:

    标签: javascript node.js mocking jestjs event-listener


    【解决方案1】:

    问题是在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 with the above
    • 你需要一个test.on 的间谍...然后.mock.calls[0][1] 将是你的回调函数。 @user2821242
    • 如果您使用更多代码更新您的问题(显示test 如何导入您的代码文件),如果有帮助,我可以创建一个更完整的答案。 @user2821242
    • 实际上你建议的工作。我的错。对于“错误”,我该怎么做?如果你在上面检查它有 test.on('data'...) 和 test.on('error')。此外,虽然这有效,但我有点困惑如何 .我不是 100% 清楚为什么 onSpy.mock.calls[0][1]。你能再解释一下吗?我已经用实际的 process() 更新了上面的内容
    • error 回调将是第二次调用test.on 的第二个参数,因此您可以使用.mock.calls[1][1] @user2821242 从您的间谍那里获取它
    猜你喜欢
    • 2018-10-15
    • 2017-12-18
    • 1970-01-01
    • 2021-01-05
    • 2019-10-10
    • 1970-01-01
    • 1970-01-01
    • 2018-09-25
    • 1970-01-01
    相关资源
    最近更新 更多