angularjs – 如何模拟在提供者私有函数中手动注入的$window?
发布时间:2020-12-17 17:59:43 所属栏目:安全 来源:网络整理
导读:我有以下提供者: angular.module('MyApp').provider('MyDevice',function () { var ngInjector = angular.injector(['ng']),$window = ngInjector.get('$window'); function isMobileDevice () { return (/iPhone|iPod|iPad|Silk|Android|BlackBerry|Opera
我有以下提供者:
angular.module('MyApp').provider('MyDevice',function () { var ngInjector = angular.injector(['ng']),$window = ngInjector.get('$window'); function isMobileDevice () { return (/iPhone|iPod|iPad|Silk|Android|BlackBerry|Opera Mini|IEMobile/) .test($window.navigator.userAgent || $window.navigator.vendor || $window.opera); } this.$get = function () { return { isDesktop: function () { return !isMobileDevice(); },isMobile: function () { return isMobileDevice(); } }; }; }); 以下测试规范: describe('MyDeviceProvider',function () { var myDevice; beforeEach(function () { inject(['MyDevice',function (_myDevice_) { myDevice = _myDevice_; }]); }); it('Test #1',function () { // Mock '$window.navigator.userAgent' to "desktop" expect(myDevice.isDesktop()).toEqual(true); expect(myDevice.isMobile()).toEqual(false); }); it('Test #2',function () { // Mock '$window.navigator.userAgent' to "mobile" expect(myDevice.isDesktop()).toEqual(false); expect(myDevice.isMobile()).toEqual(true); }); }); 我的问题是,如何在Test#1和Test#2中模拟$window以便它们成功?我已经尝试使用$provide.value和spyOn来处理无数个对象,但我似乎无法模拟$window.navigator.userAgent的值来运行我的测试. 我该如何解决这个问题? P.S:上面的代码仅作为我的问题的演示,由于应用程序的特殊要求,我无法将提供程序更改为服务. 解决方法
非常粗略,您可以执行以下操作:
describe('MyDeviceProvider',function () { var myDevice,$window,navigator; beforeEach(function () { inject(['MyDevice','$window',function (_myDevice_,_$window_) { myDevice = _myDevice_; $window = _$window_; }]); // Save the original navigator object navigator = $window.navigator; }); afterEach(function () { $window.navigator = navigator; }); it('Test #1',function () { // Mock the entire navigator object to "desktop" $window.navigator = { userAgent: "desktop" // Use a real "desktop" user agent }; // Mock '$window.navigator.userAgent' to "desktop" expect(myDevice.isDesktop()).toEqual(true); expect(myDevice.isMobile()).toEqual(false); }); it('Test #2',function () { // Mock the entire navigator object to "desktop" $window.navigator = { userAgent: "mobile" // Use a real "mobile" user agent }; // Mock '$window.navigator.userAgent' to "mobile" expect(myDevice.isDesktop()).toEqual(false); expect(myDevice.isMobile()).toEqual(true); }); }); 您应该测试模仿不同浏览器的不同模拟. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |