Angular 带window.location.replace的角度测试服务方法

Angular 带window.location.replace的角度测试服务方法,angular,unit-testing,jasmine,karma-jasmine,window.location,Angular,Unit Testing,Jasmine,Karma Jasmine,Window.location,在Angular 4应用程序中,我需要测试一个服务的方法,该方法在某个点调用同一服务的私有方法,该方法具有: window.location.replace(url) 当测试到达该行时,karma runner浏览器将被重定向到url,这当然不是我想要的。 如果我试图刺探它,我会得到: 错误::replace未声明为可写或没有setter 如何正确测试我的方法?位置对象是,其属性也是只读的 最好的测试友好策略是不直接使用本机对象,而是通过DI,因为可测试性是DI的主要优点之一 文档已经有了文档,

在Angular 4应用程序中,我需要测试一个服务的方法,该方法在某个点调用同一服务的私有方法,该方法具有:

window.location.replace(url)

当测试到达该行时,karma runner浏览器将被重定向到
url
,这当然不是我想要的。

如果我试图刺探它,我会得到:

错误::replace未声明为可写或没有setter


如何正确测试我的方法?

位置
对象是,其属性也是只读的

最好的测试友好策略是不直接使用本机对象,而是通过DI,因为可测试性是DI的主要优点之一

文档
已经有了
文档
,可以对
窗口
进行完全相同的操作,类似于AngularJS
$window
服务:

const WINDOW = new InjectionToken('window');
function getWindow() {
  return window;
}

...
{ provide: WINDOW, useFactory: getWindow }
...

...
constructor(@Inject(WINDOW) public window) {
  this.window.location.replace(...);
}
...
在此设置
窗口中
可以在测试中对提供者进行存根,并且可以彻底测试全局


或者,可以为每个正在使用的全局服务创建提供程序。

我会将对窗口的任何引用移动到单独的服务中,这应该是微不足道的,您可以在其他地方对其进行模拟