1
我想在Angular2中測試一個服務。在服務中,我多次使用window.location和window.location.hash。在閱讀Stackoverflow上的其他一些問題之後,我決定在服務中注入窗口,而不是直接使用全局窗口。Angular 2 - 依賴窗口的單元測試服務
@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);
});
我得到的錯誤如下:'錯誤:無法解析AuthService的所有參數:([object Object],?)'
因此,雖然注入模擬路由器工作得很好,但注入模擬窗口似乎不起作用。誰能幫我這個?有什麼我做錯了嗎?我一直無法找到適合我的解決方案。
因爲測試沒有在瀏覽器中運行,窗口對象將是未定義的。創建一個包裝窗口功能並檢查窗口對象是否存在的「Window」類。如果存在,返回它,否則返回一個模擬窗口。 –
難道我不能像我在上面的代碼中那樣提供一個模擬窗口嗎? – Maus94