19

カルマを使用して 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 は、アプリのコントローラーから呼び出されたときに機能しますが、カルマ ユニット テストでサービスが直接呼び出されたときには機能しません

4

3 に答える 3

4

あなたの場合、$httpBackend に対して 1 回、独自の deferred に対して 2 回、$digest する必要があります。

そう:

it('should return a allowed content type collection given a document id', function(){

    var collection;
    contentTypeResource.getAllowedTypes(1234).then(function(result){
        collection = result;
    });
    $httpBackend.flush();
    $rootScope.$digest();

    expect(collection.length).toBe(3);
});
于 2013-07-02T07:19:45.470 に答える
4

あなたはほとんどそこにいます。あなたの場合、HTTP バックエンドをフラッシュする前に、ダイジェスト サイクルを強制するだけです。以下のサンプルコードを参照してください。

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();
    $httpBackend.flush();
    expect(collection.length).toBe(3);
});
于 2013-07-02T10:00:32.207 に答える