如何为特定浏览器运行Jasmine测试?

时间:2017-08-23 11:52:25

标签: angular typescript jasmine

在我的项目中,我有一些功能可以检测当前使用的浏览器。我想使用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);
    })
});

1 个答案:

答案 0 :(得分: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');

然后可以针对真实的UA字符串测试isBrowser,因为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字符串。