我正在模拟 AngularJS 单元测试的服务。我正在使用该$provide
服务将“真实”服务替换为模拟出来的服务(可用的plunker 脚本):
describe('My Controller', function () {
var $scope;
var $provide;
beforeEach(angular.mock.module('myApp'));
beforeEach(angular.mock.module(function (_$provide_) {
$provide = _$provide_;
}));
beforeEach(angular.mock.inject(function($rootScope, $controller, $q){
var mockMyService = {
getAll : function() {
var deferred = $q.defer();
deferred.resolve([
{ itemText: "Foo" },
{ itemText: "Bar" }
]);
return deferred.promise;
}
};
$provide.value('myService', mockMyService);
$scope = $rootScope.$new();
$controller('MyCtrl', { $scope: $scope });
$rootScope.$apply();
}));
it('Has two items defined', function () {
expect($scope.items.length).toEqual(2);
});
});
这工作得很好。但是,我不喜欢我使用一个angular.mock.module
函数只是为了引用该$provide
服务,然后在angular.mock.inject
下面的函数中使用该服务。但是,如果我直接将$provide
其作为参数添加到angular.mock.inject
函数中,则会出现“未知提供者”错误。
我突然想到我可以将所有模拟代码放在angular.mock.module
函数中。但是我对$q
引用有类似的问题,我需要它,因为我的模拟服务必须返回一个承诺。
换句话说,如果我$q
向函数添加参数,angular.mock.module
那么我也会收到“未知提供者”错误。
有没有办法简化这个?显然我有什么作品,但不知何故感觉不太对劲。我觉得我缺乏理解为什么有些提供者在inject
函数中可用,而另一些在module
函数中可用。