2017-08-23 105 views
0

在我的項目中,我有一些功能可以檢測當前使用的瀏覽器。我想用Jasmine測試自動測試它們。如何爲特定瀏覽器運行茉莉花測試?

如何在選定的瀏覽器中運行一個特定的測試?

瀏覽器detection.ts:

export class BrowserDetection { 
    public static isMicrosoftInternetExplorer() { 
     return this.isBrowser('MSIE '); 
    } 

    public static isMicrosoftEdge() { 
     return this.isBrowser('Edge/') 
    } 

    public static isGoogleChrome() { 
     return this.isBrowser('chrome'); 
    } 

    /** 
    * 
    * @param browserString Browserstring as it is found in the useragent string. 
    * @returns {boolean} Returns true if there is a match for the browserstring. 
    */ 
    private static isBrowser(browserString): boolean { 
     let userAgent = window.navigator.userAgent; 
     return userAgent.indexOf(browserString) >= 0; 
    } 
} 

瀏覽器detection.spec.ts:

import {BrowserDetection} from "app/module/browser-detection/browser-detection"; 

describe('BrowserDetection',() => { 
    it('detects google chrome correctly',() => { 
     // Arrange 
     // TODO: only run this test on google chrome 

     // Act 
     let result = BrowserDetection.isGoogleChrome(); 

     // Assert 
     expect(result).toBe(true); 
    }) 
}); 
+0

另一個注意:這個測試在谷歌瀏覽器中失敗,因爲當我運行「ng test」時isBrowser()錯誤地返回false。當我們用「ng serve」運行程序時,isBrowser()會返回正確的布爾值。 – Janneman96

回答

1

它可以得到全面覆蓋的單元測試。

起初isBrowser可以存根和特定瀏覽器的方法可以測試:

spyOn(BrowserDetection, 'isBrowser'); 

BrowserDetection.isBrowser.and.returnValue(true); 
expect(BrowserDetection.isGoogleChrome()).toBe(true); 

BrowserDetection.isBrowser.and.returnValue(false); 
expect(BrowserDetection.isGoogleChrome()).toBe(false); 

expect(BrowserDetection.isBrowser).toHaveBeenCalledWith('chrome'); 

然後isBrowser可以針對實際UA字符串進行測試,因爲navigator.userAgent不能存根。

expect(BrowserDetection.isBrowser(navigator.userAgent)).toBe(true); 
expect(BrowserDetection.isBrowser(navigator.userAgent.slice(5, -5))).toBe(true); 
expect(BrowserDetection.isBrowser('foo')).toBe(false); 
expect(BrowserDetection.isBrowser(navigator.userAgent + 'foo')).toBe(false); 

另外,BrowserDetection可以使用其他服務,window服務(靜態只類反模式的任何方式),這樣window和它的屬性可以在測試中被嘲笑,並提供假UA字符串。

+0

這些是在這個文件上運行的一些很好的測試。但是,我想要做的是運行isChromeChrome(),並使用真實的window.navigator.userAgent檢查測試是否在Google Chrome中運行時是否爲真。 – Janneman96

+0

當這個類被上面的單元測試覆蓋時,你不需要用真正的UA字符串進行功能測試。這就是單元測試的目的。你也可以做'if(/chrome/i.test(navigator.userAgent){it(...)}',但它是多餘的。 – estus