Угловой метод тестирования сервиса с помощью 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 провайдер может быть зарезан в тестах, а глобальные могут быть тщательно протестированы.

В качестве альтернативы, провайдеры могут быть созданы для каждого глобального использования.

Другие вопросы по тегам