【问题标题】:Angular testing Service method with window.location.replace带有 window.location.replace 的角度测试服务方法
【发布时间】:2017-08-29 04:07:44
【问题描述】:

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

window.location.replace(url);

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

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

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

如何正确测试我的方法?

【问题讨论】:

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


【解决方案1】:

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

最好的测试友好策略是不直接使用原生对象,而是通过 DI,因为可测试性是 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 提供程序可以在测试中存根,并且可以彻底测试全局变量。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-26
    • 2018-01-18
    • 1970-01-01
    • 2019-07-13
    • 2020-06-24
    相关资源
    最近更新 更多