#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. Получаем только один вывод в консоли.