Какой самый простой способ проверить слушателей событий в шутку? - PullRequest
0 голосов
/ 24 апреля 2019

Я пытаюсь проверить приведенную ниже функцию

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

Я ожидаю, что process() будет вызываться 10 раз сданные отправляются 10 раз.Однако он вызывается только 2 раза, когда я утверждаю, но когда я помещаю console.log в саму функцию и запускаю тест, он вызывается 10 раз.

Я не уверен, что не так.Ценю любую помощь.

1 Ответ

0 голосов
/ 24 апреля 2019

Проблема в том, что вызов 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!
});
...