Угловой метод тестирования сервиса с помощью window.location.replace
В моем приложении Angular 4 мне нужно протестировать метод Сервиса, который в какой-то момент вызывает частный метод того же сервиса, имеющий:
window.location.replace(url);
Когда тест достигает этой линии, браузер бегущего за кармой перенаправляется на url
что, конечно, не то, что я хочу.
Если я пытаюсь шпионить, я получаю:
Error: <spyOn> : replace is not declared writable or has no setter
Как я могу правильно проверить свой метод?
1 ответ
location
Объект доступен только для чтения, а его свойства доступны только для чтения.
Лучшая стратегия, дружественная к тестам, состоит в том, чтобы не использовать нативные объекты напрямую, а через DI, потому что тестабилир является одним из главных преимуществ DI.
document
уже имеет DOCUMENT
поставщик абстракции, то же самое можно сделать для window
целиком, аналогично AngularJS $window
оказание услуг:
const WINDOW = new InjectionToken('window');
function getWindow() {
return window;
}
...
{ provide: WINDOW, useFactory: getWindow }
...
...
constructor(@Inject(WINDOW) public window) {
this.window.location.replace(...);
}
...
В этой настройке WINDOW
провайдер может быть зарезан в тестах, а глобальные могут быть тщательно протестированы.
В качестве альтернативы, провайдеры могут быть созданы для каждого глобального использования.