AngularJS 単体テスト用のサービスをモックしています。私はサービスを使用して$provide
、「実際の」サービスをモックアウトされたサービスに置き換えています(これのプランカースクリプトが利用可能です):
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
ます。