角度测试使用window.location.replace的服务方法

时间:2017-08-28 19:49:55

标签: angular unit-testing jasmine karma-jasmine window.location

在我的Angular 4应用程序中,我需要测试一个服务的方法,它在某些时候调用同一服务的私有方法:

window.location.replace(url);

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

如果我试图窥探它,我会:

Error: <spyOn> : replace is not declared writable or has no setter

如何正确测试我的方法?

1 个答案:

答案 0 :(得分:0)

location对象为read-only property,其属性也是只读的。

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

document已经有DOCUMENT provider abstraction,完全可以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提供程序可以在测试中存根,并且可以对全局变量进行全面测试。

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