我正在嘲笑AngularJS单元测试的服务。我使用的是$provide
服务与嘲笑了一个(这是可用plunker script),以取代“真实”服务:
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
函数,那么我也会得到一个'unknown provider'错误。
有没有办法简化这个?很显然,我有些作品,但不知怎的,它感觉不太对劲。我觉得我对inject
函数中为什么有些提供程序可用以及module
函数中可用的其他提供程序不了解。
这是非常好的,它的工作原理...只要你不使用诺言。这里是一个显示我原来的例子plunk:http://plnkr.co/edit/1Gbr1N?p=preview 这里是一个叉你用建议的技术更新:http://plnkr.co/edit/ptAWcb?p =预览 模拟服务没有被分配;它看起来好像有些事情正在干扰时机。 – Holf
我想知道为什么我无法从'模块'功能中获得'$ q'库?如果可以的话,那么我就有我需要的一切来在那里创建模拟服务。 – Holf
@Holf您可以使用承诺,但您需要首先移动一些东西。看看这个更新的[Plunker脚本](http://plnkr.co/edit/Fi1SQq)。 –