カルマを使用して angular サービスを単体テストします。これらのサービスには $http 呼び出しが含まれているため、サーバーとデータベースなしでアプリを実行できるように、モックされた $httpbackend が配置されています。これは正常に機能し、サービスは $http("someurl?id=1234") を呼び出すことができ、正しいデータが返されます。
しかし、単体テストで同じことをしようとすると、動作させることができず、$http が含まれる場合、promise は決して解決されません。
サービス:
getAllowedTypes: function (contentId) {
var deferred = $q.defer();
$http.get(getChildContentTypesUrl(contentId))
.success(function (data, status, headers, config) {
deferred.resolve(data);
}).
error(function (data, status, headers, config) {
deferred.reject('Failed to retreive data for content id ' + contentId);
});
return deferred.promise;
}
モックされた $httpbackend
$httpBackend
.whenGET(mocksUtills.urlRegex('/someurl'))
.respond(returnAllowedChildren); //returns a json object and httpstatus:200
テスト
it('should return a allowed content type collection given a document id', function(){
var collection;
contentTypeResource.getAllowedTypes(1234).then(function(result){
collection = result;
});
$rootScope.$digest();
expect(collection.length).toBe(3);
});
ただし、コレクションは未定義であり、.then() は呼び出されません。
$rootScope.$apply()、$digest、$httpBacke.flush() という約束を解決するためにほとんどすべてを試しましたが、何も機能しません
そのため、モックされた $httpBackend は、アプリのコントローラーから呼び出されたときに機能しますが、カルマ ユニット テストでサービスが直接呼び出されたときには機能しません