2016-04-27 11 views
1

apiとデータを接続して相互作用するservice factoryがあります。ここでは、サービスがある:カルマで解決されないサービス約束

describe('Service: Request', function() { 
    var $scope, srvMock, $q, lc, $httpBackend; 

    beforeEach(module('webApp')); 

    beforeEach(inject(function($rootScope, Request, _$q_, _$httpBackend_, localConfig){ 
    $scope = $rootScope.$new(); 
    srvMock = Request; 
    $q = _$q_; 
    $httpBackend = _$httpBackend_; 
    lc = localConfig; 

    $httpBackend.expect('GET', lc.dbDataUrl); 

    $httpBackend.when('GET', lc.dbDataUrl).respond({ 
     success: ["d1","d2", "d3"] 
    }); 
    })); 

    it('should return a promise', function(){ 
    expect(srvMock.getDataRevision().then).toBeDefined(); 
    }); 

    it('should resolve with data', function(){ 
    var data; 
    var deferred = $q.defer(); 
    var promise = deferred.promise; 

    promise.then(function(res){ 
     data = res.success; 
    }); 

    srvMock.getDataRevision().then(function(res){ 
     deferred.resolve(res); 
    }); 

    $scope.$digest(); 

    expect(data).toEqual(["d1","d2", "d3"]); 
    }) 
}); 

should return a promiseパスが、次のshould resolve with dataは、このエラーで失敗します:

this answerから手がかりを取る
angular.module('dbRequest', []) 
    .factory('Request', ['$http', 'localConfig', function($http, localConfig){ 
    return { 
     getDataRevision: function(){ 
     return $http({ 
      url: localConfig.dbDataUrl, 
      method: "GET", 
      crossDomain: true, 
      headers: { 
      'Content-Type': 'application/json; charset=utf-8' 
      } 
     }) 
     } 
    } 
    }]); 

、これは私が方法をテストしてい方法です

Expected undefined to equal [ 'd1', 'd2', 'd3' ]. 

しかし、serviceの方法getDataRevisionが呼び出されていますが、模擬約束で解決されていません。 nテスト。どのように修正するのですか?

答えて

1

現在、あなたはhttpRequest Sをフラッシュせずdata変数にそこに嘲笑データを期待しているが、それはあなたまで発生しませんflushすべてhttpRequest秒。 $httpBackend.flush()は、$httpBackend.when('GET', lc.dbDataUrl).respondを使って行った特定のリクエストに模擬データを返します。

また、オーバーヘッドとなる余分な約束をする必要はありません。カスタムの約束を持つ代わりに、あなたは以下のように約束されたサービスを返すことができます。

コード

it('should resolve with data', function(){ 
    var data; 

    srvMock.getDataRevision().then(function(res){ 
     data = res.success; 
    }); 

    $scope.$digest(); 
    $httpBackend.flush(); //making sure mocked response has been return 
    //after .then evaluation only below code will get called. 
    expect(data).toEqual(["d1","d2", "d3"]); 
}) 
+0

ソリューションは完璧に動作します!しかし、テストケースがどのように実行されているか説明してもらえますか? 'httpbackend success'レスポンスは常に' expected data'と等しいでしょうか?言い換えれば、サービス「約束」から返された「応答」をどのようにテストするのですか? – faizanjehangir

+0

@faizanjehangir私はそれをしました..更新を見てください.. –

関連する問題