sti*_*rts 7 unit-testing window.location jasmine angular
我有这个功能我需要测试:
login(): void {
this.userService.setSessionAndDateOnlogin();
this.loginService.getLogin()
.subscribe(
octopusUrl => window.location.href = octopusUrl);
}
Run Code Online (Sandbox Code Playgroud)
我使用window.location.href导航到外部URL.
这是我的测试:
it('login function should call the setSessionAndDateOnLogin function from the userservice and\
subscribe to the getLogin function of the loginService.',
fakeAsync(
inject(
[LoginComponent, LoginService, UserService],
(loginComponent: LoginComponent, loginService: LoginService, userService: UserService) => {
spyOn(userService, 'setSessionAndDateOnlogin');
loginComponent.login();
expect(userService.setSessionAndDateOnlogin).toHaveBeenCalled();
})
)
);
Run Code Online (Sandbox Code Playgroud)
当我运行此测试时,我收到以下错误:
你的一些测试做了整页重装!
所以我试着模仿窗口对象:
import { window } from '@angular/platform-browser/src/facade/browser';
...
class MockWindow {
location: {
href: ''
};
}
...
beforeEach(() => addProviders([
...
{ provide: window, useClass: MockWindow }
]));
Run Code Online (Sandbox Code Playgroud)
这没有改变,错误仍然存在.
有没有人有这个问题的解决方案?
小智 5
Window是一个接口,不能被注入。您应该使用 OpaqueToken
import {Injectable, OpaqueToken, Inject} from '@angular/core';
export const WindowToken = new OpaqueToken('Window');
export const SomeServiceWithWindowDependencyToken = new OpaqueToken('SomeServiceWithWindowDependency');
export function _window(): Window {
return window;
}
export class SomeServiceWithWindowDependency {
private window: Window;
constructor(@Inject(WindowToken) window: Window) {
this.window = window;
}
}
Run Code Online (Sandbox Code Playgroud)
然后在测试中
describe('SomeServiceWithWindowDependency', () => {
beforeEach(() => {
let mockWindow: any = {
location: {
hostname: ''
}
};
TestBed.configureTestingModule({
providers: [
{provide: WindowToken, useValue: mockWindow},
{provide: SomeServiceWithWindowDependencyToken, useClass: SomeServiceWithWindowDependency}
]
});
});
it('should do something', inject([SomeServiceWithWindowDependencyToken, WindowToken], (tested: SomeServiceWithWindowDependency, window: Window) => {
window.location.hostname = 'localhost';
expect(tested.someMethod()).toBe('result');
}));
});
Run Code Online (Sandbox Code Playgroud)
并记住配置应用程序模块以使用真实的窗口对象
@NgModule({
declarations: [
...
],
imports: [
...
],
providers: [
...
{provide: WindowToken, useFactory: _window},
],
bootstrap: [AppComponent]
})
export class AppModule {
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4475 次 |
最近记录: |