Некоторые важные моменты, которые следует учитывать.
Асинхронный код в ваших тестах
Если вам нужно выполнить асинхронныйзадач в ваших тестах вы всегда должны ждать, пока асинхронная работа не будет завершена.
setTimeout(() => {
mountWrapper.update()
const SpyhandleChildClick = jest.spyOn(mountWrapper.instance(),'_handleChildClick')
mountWrapper.find('.toggle').simulate('click')
expect(SpyhandleChildClick).toHaveBeenCalled() // not called
},0)
Выше в вашем коде у вас есть сегмент тайм-аута.Любое условие теста внутри этого блока кода не будет оцениваться, так как к тому моменту, когда они будут оценены, ваш «сеанс теста» уже будет завершен из-за характера синхронизации.
Проверка функций стрелок в Reactwith энзим - forceUpdate ()
Похоже, что существует проблема с библиотекой ферментов, когда вам необходимо принудительно обновить компонент реакции после шпионажа, чтобы он привязался к методу.Пожалуйста, следите за выпуском github для получения дополнительной информации: https://github.com/airbnb/enzyme/issues/365
Я также немного очистил ваш тестовый код, чтобы сделать его более понятным!
// App.test.js
import React from 'react';
import {enzyme} from 'enzyme';
import App from './App';
describe("App test cases", () => {
it("should trigger _handleChildClick", async () => {
window.fetch = jest.fn().mockImplementation(() => ({
status: 200,
json: () =>
new Promise((resolve, reject) => {
resolve({
name: "some data"
});
})
}));
const mountWrapper = mount(<App />);
mountWrapper.update();
console.log("mountWrapper", mountWrapper.debug()); // showing the loader one
//[FIX]This code will block and wait for your asynchronous tasks to be completed
await new Promise(res => setTimeout(() => res(), 0));
mountWrapper.update();
console.log("mountWrapper", mountWrapper.debug()); // nothing showing
expect(mountWrapper.find(".toggle").length).toEqual(1);
//[FIX]Get a reference from the wrapper and force update after the spyOn call
const instance = mountWrapper.instance();
const spy = jest.spyOn(instance, "_handleChildClick");
instance.forceUpdate();
mountWrapper.find(".toggle").simulate("click");
expect(spy).toHaveBeenCalled();
});
});
Демонстрационная ссылка Live: нажмите на кнопку 'Вкладка «Тесты» в браузере для просмотра результатов теста https://codesandbox.io/s/mz21kpm37j