我有以下服务和指令:
angular.module("epcApp", [])
.service("epcData", function($http, $q){
var urls = {
load: "some-url",
save: "some-url"
};
this.load = function(){
return $http.get(urls.load).then(function(data){
return data;
});
}
this.save = function(req){
return $http.get(urls.save, req).then(function(data){
return data;
});
}
})
.directive("epc", ['epcData', function(epcData){
return {
restrict: "E",
templateUrl: "some-url",
link: function(scope, element, args, form){
scope.collectSelects = function(container){
// some code
}
scope.collectCheckBoxes = function(container){
// some code
}
epcData.load().then(function(data){
scope.userOptions =
// do something with scope.collectCheckBoxes and scope.collectSelects
});
}
}
}]);
我想测试一下:
我无法弄清楚如何模拟服务。这就是我在文档中看到的内容:
//Load the EPC main module
beforeEach(module('epcApp'));
//Intialize the directive with a mock scope
beforeEach(function(){
var element, scope, epcData, $httpBackend, mock;
mock = {
load: jasmine.createSpy(),
save: jasmine.createSpy()
}
module(function($provide){
$provide.service('epcData', mock);
})
inject(function($rootScope, $compile, $injector){
epcData = $injector.get('epcData');
scope = $rootScope.$new();
element = angular.element("<epc></epc>");
element = $compile(element)(scope);
scope.$digest();
})
});
it("should have loaded data", function(){
expect(mock.load).toHaveBeenCalled();
})
我收到以下错误Error: [ng:areq] Argument 'fn' is not a function, got Object
如果我完全删除了$provide
和$injector
部分,当实际epcData.load
方法尝试执行http时,我收到'意外请求'错误请求。所以我似乎越来越接近覆盖服务方法,但我做错了。
答案 0 :(得分:0)
错误即将发生,因为您需要传递构造函数来创建Angular服务。你正在传递一个物体。
您可以使用value
功能代替service
$provide.value('epcData', mock);
或者你可以创建一个虚拟构造函数。
此外,jasmine spy的实现应返回一个promise,否则调用函数将失败(no then
)。请参阅jasmine的文档并从虚函数返回$q.when()
。