2017-08-28 65 views
0

在我的角4應用程序,我需要測試它在某個時候調用同一個服務的私有方法有服務的方法:角測試服務方法與window.location.replace

window.location.replace(url);

當測試到達那條線時,karma-runner瀏覽器被重定向到url,這當然不是我想要的。

如果我試圖窺探它,我得到:

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

我該如何正確測試我的方法是什麼?

+2

我會將對窗口的任何引用移動到單獨的服務中,這應該是微不足道的,然後您可以在其他位置模擬。 – jonrsharpe

回答

0

location對象是read-only property,其屬性也是隻讀的。

最好的測試友好策略是不直接使用本地對象,而是通過DI,因爲testabiliry是DI的主要優點之一。

document已經DOCUMENTprovider 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提供者可以在測試存根和全局可以徹底的測試。

或者,可以爲使用的每個全局創建提供者。