Проблемы с асинхронными тестами с использованием fetch и spyOn в шутку

#javascript #reactjs #typescript #asynchronous #jestjs

Вопрос:

У меня возникла проблема, когда последний случай test.each приведенного ниже блока, похоже, работает с реальной реализацией fetch() , а не шпионской версией.

 describe('renders correct number of components', () =gt; {  afterEach(() =gt; {  jest.restoreAllMocks();  });   test.each([1,2,3,4])('renders %i components', async (componentCount) =gt; {  jest.spyOn(window, 'fetch').mockResolvedValueOnce({  json: async () =gt; ({ components: componentCount })  } as Response);   render(lt;ParentComponent /gt;);    expect(await screen.findAllByText(/my component/i)).toHaveLength(componentCount);  });  });  

Реальная реализация заключается в:

 const getSomeData = async (): Promiselt;ComponentDatagt; =gt; {  const res = await fetch('http://localhost:8080', { method: "GET" });  return res.json();  }  

Когда я запускаю тесты, первые 3 проходят нормально, однако 4 — й бросает Error: connect ECONNREFUSED 127.0.0.1:8080 . Если я удалю 4 — й тест, то же самое произойдет и с 3-м.

Если я изменюсь http://localhost:8080 на что-то подобное https://google.com , я получу предупреждение о том, что «рабочий процесс не завершается корректно», но все тесты проходят, и ошибок нет.

Мне кажется, что каким-то образом восстановленное fetch() проходит последнее испытание без ремокирования, spyOn() но я ни за что в жизни не пойму, как это сделать.

Комментарии:

1. Определенно странно. Я думаю, что ваше наблюдение верно. Решает ли как- jest.restoreAllMocks() то проблему переход в последнюю строку тестового блока?

2. Эй @Jackyef да , я пробовал перемещать его как до, так и после expect() , хотя результат тот же, 4-й тест провалился, другие в порядке, спасибо!

3. Я понимаю. Есть ли вероятность того, что lt;ParentComponent /gt; вызов вызывается более одного раза? Скажем, если мы введем console.log() функцию, вызывающую fetch, всегда ли она регистрируется только один раз для каждого из тестовых случаев?

4. Получаем только один вывод в консоли.