我制作了一个简单的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
对象,而不是模拟。
我做错了什么?为什么我的模拟不工作?
答案 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();
});
});