Angular.js单元测试 - 麻烦嘲笑$ window

时间:2015-08-25 18:14:48

标签: javascript angularjs unit-testing

我制作了一个简单的Angular服务来与本地存储进行交互。它有has方法返回true / false,具体取决于密钥是否存在于本地存储中。

angular.module("jbLocalStorage", [])
.service("localStorageService", ["$window", function($window){

  this.has = function(key){
    console.log($window); //added to see what $window is referencing in unit test
    if ($window.localStorage.getItem(key) !== null){
      return true;
    } else {
      return false;
    }
  };
}]);

我在单元测试中嘲笑$ window时遇到了麻烦。单元测试似乎仍然是访问全局窗口对象而不是访问模拟。

这是我对此服务的单元测试。我尝试使用$window函数创建一个模拟getItem对象。

describe("Has function", function(){
  var localStorageService;

  beforeEach(module('jbLocalStorage'), function($provide){
    $provide.value('$window', {
      localStorage : {
        getItem : function(key){
          if (key === "shape") {return "triangle";} else {return null;}
        },
      },
    });
  });

  beforeEach(inject(function(_localStorageService_){
    localStorageService = _localStorageService_;
  }));

  it("should return true if key is found in local storage", function(){
    expect(localStorageService.has("shape")).toEqual(true);
  });
});

我的测试失败了,因为测试似乎在查看全局window对象并且没有找到" shape"而不是查看模拟并找到"形状"

我知道它正在这样做,因为服务中的console.log行显示它仍然引用全局window对象,而不是模拟。

我做错了什么?为什么我的模拟不工作?

2 个答案:

答案 0 :(得分:2)

我做了类似的事情,并让它发挥作用。在查看我的代码后,我相信我有一个解决方案。

我认为您需要在致电$provide之前致电module('jbLocalStorage')。我相信正在发生的事情是$window服务被module调用注入到您的代码中,然后您在注入后修改该值。

所以这应该有效:

beforeEach(function() {
    module(function($provide) {
        $provide.value('$window', {
            localStorage : {
                getItem : function(key){
                    if (key === "shape") {return "triangle";} else {return null;}
                },
            },
        });
    });
    module('jbLocalStorage');
});

答案 1 :(得分:2)

$ provide应注入模块函数。

请参阅此处的小提琴 - http://jsfiddle.net/eitanp461/bvsp41yz/

describe("Has function", function(){
  var localStorageService;

  beforeEach(module('jbLocalStorage', function($provide){
    $provide.value('$window', {
      localStorage : {
        getItem : function(key){
          if (key === "shape") {return "triangle";} else {return null;}
        },
      },
    });
  }));

  beforeEach(inject(function(_localStorageService_){
    localStorageService = _localStorageService_;
  }));

  it("should return true if key is found in local storage", function(){
    expect(localStorageService.has("shape")).toEqual(true);
    expect(localStorageService.has("wat?")).toBeFalsy();
  });
});