В конфигурации Jest с JSDOM global.window === global
, поэтому его можно смоделировать на window
.
Желательно смоделировать его как
jest.spyOn(window, 'alert').mockImplementation(() => {});
, поскольку window.alert = jest.fn()
загрязняет другие тестыв этом наборе.
Проблема с тестированием черного ящика заключается в том, что устранение неполадок затруднено, и полагаться на поведение, ожидаемое от реального DOM, может вызвать проблемы, поскольку Enzyme не обязательно поддерживает это поведение.Неизвестно, была ли вызвана действительная проблема, handleSubmit
, или нет, то, что alert
макет не был вызван, является просто доказательством того, что что-то пошло не так.
В этом случае click
событие на кнопке выигралоне вызывает submit
событие в родительской форме, потому что Enzyme не поддерживает это по проекту .
Правильная стратегия юнит-тестирования состоит в том, чтобы настроить шпионов или издевательства для всех юнитов, кроме протестированных.один, который является обработчиком события submit.Обычно это shallow
вместо mount
.
Вероятно, это должно быть:
jest.spyOn(window, 'alert').mockImplementation(() => {});
const formWrapper = wrapper.find(Form).dive();
jest.spyOn(formWrapper.instance(), '_handleSubmit');
formWrapper.find("form").simulate("submit");
expect(formWrapper.instance()._handleSubmit).toBeCalled();
expect(window.alert).toBeCalledWith(...);
Состояние должно быть изменено напрямую с помощью formWrapper.setState
вместо моделирования событий DOM.
Более изолированным модульным тестом было бы утверждать, что form
был предоставлен ожидаемый onSubmit
реквизит и напрямую вызывать formWrapper.instance()._handleSubmit(...)
.