Окно модульного тестирования.местоположение.перезагрузка в модульном тестировании angular 12?

#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}