在我的Angular 4应用程序中,我需要测试一个服务的方法,它在某些时候调用同一服务的私有方法:
window.location.replace(url);
当测试到达该行时,karma-runner浏览器会被重定向到url
,这当然不是我想要的。
如果我试图窥探它,我会:
Error: <spyOn> : replace is not declared writable or has no setter
如何正确测试我的方法?
答案 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
提供程序可以在测试中存根,并且可以对全局变量进行全面测试。
或者,可以为每个正在使用的全局创建提供程序。