开玩笑地测试事件侦听器的最简单方法是什么?

时间:2019-04-24 03:44:44

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

我正在尝试测试以下功能

foreach (InventoryReportBodyElement Record in ddrMessage.DdrInstances)
        {
        //InventoryReportBodyElement OSClass = ddrMessage.DdrInstances.Where(m => m.Class == "CCM_DiscoveryData");                    
        Debug.WriteLine(Record.ToString());
        }

笑话: //在beforeEach

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

我不确定这是怎么回事。感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

问题在于,在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!
});