我正在嘲笑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)。 –