在我的项目中,我有一些功能可以检测当前使用的浏览器。我想使用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 :(得分: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字符串。