2017-06-27 108 views
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],?)'

因此,雖然注入模擬路由器工作得很好,但注入模擬窗口似乎不起作用。誰能幫我這個?有什麼我做錯了嗎?我一直無法找到適合我的解決方案。

+0

因爲測試沒有在瀏覽器中運行,窗口對象將是未定義的。創建一個包裝窗口功能並檢查窗口對象是否存在的「Window」類。如果存在,返回它,否則返回一個模擬窗口。 –

+0

難道我不能像我在上面的代碼中那樣提供一個模擬窗口嗎? – Maus94

回答

0

嘗試像這樣

在您的服務:

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存在一個開放的bug https://github.com/angular/angular/issues/15640

相關問題