如何使用Jasmine模拟$ window.innerWidth AngularJS

时间:2015-10-07 09:12:26

标签: angularjs unit-testing jasmine karma-jasmine

在我的AngularJS(1.4.4)应用程序中,我有工厂:

    ( function () {
    "use strict";

    angular
        .module("app")
        .factory("DeviceTypeService", DeviceTypeService);

    function DeviceTypeService($window) {

        function isTablet () {
            var width = $window.innerWidth;
            return width > 639;
        }

        return {
            isTablet: isTablet
        };
    }

})();

我需要用Jasmin对它进行单元测试,在Karma上运行。我尝试了不同的解决方案,但我的测试每次都失败了。

我的解决方案之一:

'use strict';

describe('DeviceType Service', function(){
 var mock_window,
     sut;

 beforeEach(function(){
   module('app');
   mock_window = {innerWidth: 1000};

   module(function($provide){
        $provide.value('$window', mock_window);
    });
 });

 beforeEach(inject(function(_DeviceTypeService_){
   sut = _DeviceTypeService_;
 }));

 it('isTablet() method shoul return "true" if $window.innerWidth > 639 px', function(){
    expect(sut.isTablet()).toBeTruthy();
  });
});

此测试返回FAILED Expected false to be truthy。我几乎试图为$window.innerWidth创建SPY,但它也不起作用。

我用: PhantomeJS(v 1.9.18)。 茉莉花(第2.3.4节)。 卡玛(第0.13.10节)

请告诉我我的错误或提供一些工作代码。

1 个答案:

答案 0 :(得分:1)

我没有设法找出错误的原因,因为当我尝试你的例子时,它完全没问题并且测试通过了。

我已将您的样品放在jsfiddle上 - 您可以自行检查:"运行" &安培;在输出中都是绿色的。

我添加的唯一内容是:

link to http://jasmine.github.io/2.3/lib/jasmine.js
link to http://jasmine.github.io/2.3/lib/jasmine-html.js
link to http://jasmine.github.io/2.3/lib/jasmine.css
link to http://jasmine.github.io/2.3/lib/boot.js
link to http://code.angularjs.org/1.4.4/angular.js
link to http://code.angularjs.org/1.4.4/angular-mocks.js

var myApp = angular.module('app', []); - before your code

uninteresting copy of IsTablet - just to play with and see something red

copied-pasted a simple Jasmine runner at the end of the file

所以......可以肯定地说,没有实际的改变。

在小提琴上自己尝试一下,如果代码没有重大变化,请检查libs版本是否相同,检查你是否忘记了像角度模拟这样的东西

仅供参考:首先,我没有注意到您使用的版本,我在角度1.2.9和jasmine 1.3上测试了您的代码 - 它有效。当我更新小提琴使用角1.4.4和茉莉花1.3 - 它仍然有效。现在我将它更新到几乎你的版本 - 1.4.4 / 2.3.0 - 仍然有效。我没有找到任何2.3.4镜子。

..所以,也许它与Phantom有关?但这很奇怪,因为它不应该对有角度的$窗口做任何特殊处理。