#reactjs #unit-testing #jestjs #enzyme #react-testing-library
#reactjs #модульное тестирование #jestjs #фермент #react-testing-library
Вопрос:
Я искал в Интернете, но я не нашел способа издеваться window.close()
в библиотеке тестирования react или даже в шутку.
const handleClose = () => {
window.opener.location.reload()
window.close()
}
<Button
data-test-id="close"
onClick={handleClose}
/>
Как мне добиться покрытия тестового примера для onclick
кнопки of и window.close()
и window.opener.location.reload()
покрывается
Мой тестовый пример выглядит следующим образом:
const wrapper = render( <CloseButton />);
const windowSpy = jest.spyOn(global, 'window', 'get');
const { queryByTestId } = wrapper;
fireEvent.click(queryByTestId('close');
expect(windowSpy.opener.location.relaod).toHaveBeenCalled();
expect(windowSpy.close).toHaveBeenCalled();
для этой последней строки кода
expect(windowSpy.close).toHaveBeenCalled();
Я получаю сообщение об ошибке, в котором говорится
полученное значение должно быть макетом или шпионской функцией. полученное значение не определено
Для
expect(windowSpy.opener.location.relaod).toHaveBeenCalled();
в нем говорится:
windowSpy.opener
не определено.
Ответ №1:
Вы только издеваетесь над window, но не предоставляете никакой реализации.
Это должно помочь:
windowSpy.mockImplementation(() => ({
close: jest.fn(),
opener: {
location: {
reload: jest.fn(),
}
}
}));
Комментарии:
1. @Axnyff- Как мне также смоделировать window.opener.location.reload, потому что в этом случае говорится, что window.opener не определен
2. Можете ли вы добавить этот объект рядом со свойством close ?
Ответ №2:
Если вам на самом деле не нужен шпион, просто макет, мне повезло просто переназначить конкретную оконную функцию:
global.window.opener.location.reload = jest.fn()
Ответ №3:
Замечательный знак предоставляет решение для этого, которое позволяет избежать всех вышеуказанных ошибок, а также reload is not declared configurable
ошибки, которые вы можете получить при попытке reload()
прямого изменения. См .:
https://remarkablemark.org/blog/2018/11/17/mock-window-location/
Код копируется сюда непосредственно с этой страницы ^:
describe('window.location', () => {
const { location } = window;
beforeAll(() => {
delete window.location;
window.location = { reload: jest.fn() };
});
afterAll(() => {
window.location = location;
});
it('mocks `reload`', () => {
expect(jest.isMockFunction(window.location.reload)).toBe(true);
});
it('calls `reload`', () => {
window.location.reload();
expect(window.location.reload).toHaveBeenCalled();
});
});
Спасибо, Марк!