#angular #unit-testing #angular-unit-test #angular12
Вопрос:
В моем угловом проекте у меня есть функция
reloadPage(): void {
window.location.reload();
}
Поэтому, когда мне нужно было перезагрузить страницу, я обычно вызывал эту функцию.
Теперь я пытаюсь добавить модульное тестирование для этой функции, но оно не работает.
it("reloadPage: should be validated", () => {
spyOn(window.location, 'reload').and.callFake(() => {
//test
});
component.reloadPage();
});
Он по-прежнему перезагружает страницу при модульном тестировании
Как я могу выполнить модульный тест для этой функции? Любая помощь может быть оценена по достоинству. Заранее спасибо
Комментарии:
1. просто как идея, не уверен, сработает ли это — может ли переназначить
reload
метод с помощью шпиона?window.location.reload = jasmine.spy()
. Не забудьте восстановить метод перезагрузки после тестового запуска
Ответ №1:
Я нашел следующее решение для работы.
В вашем компоненте введите в окно символ InjectionToken
.
const MY_WINDOW_TOKEN = new InjectionToken<Window>('Window');
Затем конструктор вашего компонента принимает:
constructor(@Inject(MY_WINDOW_TOKEN) private window: Window) { ... }
В своем модуле предоставьте:
{ provide: MY_WINDOW_TOKEN, useValue: window }
В вашем тесте (спецификации) вместо этого введите другое (макет) окно, предоставив макет / шпионскую реализацию в конфигурации тестового стенда:
{
provide: MY_WINDOW_TOKEN,
useFactory: () => {
return jasmine.createSpyObj('Window', [...]);
}
}
В основном это сводится к изоляции объекта тестирования от его зависимостей.
(Обратите внимание: весь код написан из памяти и может потребовать некоторых изменений для реальной работы / компиляции)
Ответ №2:
Вы должны предоставить макет Window
объекта в своем TestBed.configureTestingModule
windowMock = {
location: {
reaload: jasmine.createSpy('reaload')
}
}
А потом в providers
{provide: WINDOW, useValue: windowMock}