我试图在Angular2中测试服务。在服务中,我多次使用window.location和window.location.hash。在阅读Stackoverflow上的其他一些问题之后,我决定在服务中注入窗口,而不是直接使用全局窗口。
@Injectable()
export class AuthService {
constructor(private router: Router, private window: Window) { }
}
我在app.module.ts
注册了一个窗口:
providers: [
AuthService,
{
provide: Window,
useValue: window
},
OtherService
]
现在,在我的测试中,我试图以与此答案类似的方式模拟窗口:https://stackoverflow.com/a/37176904
beforeEach(() => {
routerStub = {
navigate: jasmine.createSpy('navigate')
};
mockWindow = <any> { location: <any> {hash: 'testhash'}};
TestBed.configureTestingModule({
providers: [
AuthService,
{ provide: Router, useValue: routerStub },
{ provide: Window, useValue: mockWindow }
]
});
authService = TestBed.get(AuthService);
});
我得到的错误如下:&#39;错误:无法解析AuthService的所有参数:([object Object],?)&#39;
因此,虽然注入模拟路由器工作得非常好,但注入模拟窗口似乎并不起作用。谁能帮我这个?我有什么不对的吗?我还没有找到适合我的解决方案。
答案 0 :(得分:1)
尝试这样
在您的服务中:
constructor(http: Http, @Inject('Window') private window: Window) {
super(http);
console.log(window.location);
}
在您提供服务的模块中,提供如下窗口:
providers: [AuthService,{ provide: 'Window', useValue: window }, OtherService]
然后在你的测试中:
...
mockWindow = { location: {hash: 'testhash'}};
TestBed.configureTestingModule({
providers: [
AuthService,
{ provide: Router, useValue: routerStub },
{ provide: 'Window', useValue: mockWindow },
]
});
...
但请注意,AoT存在漏洞 https://github.com/angular/angular/issues/15640