繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM