2017-09-26 14 views
0

私の工場では、HTTP呼び出しをリクエストしてそれらを約束の配列に追加するループがあります。 その後、結果を$q.allにしてモデルを作成します。 しかし、私はこれをテストするために来て、私はすべての呼び出しを行うためにHTTPを取得することはできません、それは最後のものを作るだけで、私はすべての呼び出しを行い、モデルを構築する必要があります。 は、以下の非常にユニットテスト複数のHTTPリクエスト

工場コード

function getLatestData(){ 
    var dateArray= ['2017-09-21','2017-09-22'] 
    for (i = 0; i < 2; i++) { 
     var url = 'data-server/date/[i]'            
     promises.push(getData(url)); // getData is a simple $http function call. 
    } 
    return $q.all(promises).then(function(response){ 
    buildModel(reponse); 
    }); 
} 

は、私はこれをテストするために来たときにそう、私のようなものを持っている(私は7つの日付を使用しますが、短いものを維持したかった)、コードを削減されます(私はループを試みましたが、失敗しました)。

httpBackend.expectGET('data-server/date/2017-09-21').respond(mockData[0]); 
httpBackend.expectGET('data-server/date/2017-09-22').respond(mockData[1]); 
rootScope.$apply(); 
    modelFactory.getLatestData().then(function(response){ 
      expect(response).toEqual(mockModelData); 
    }) 

だから私は、get URLをCONSOLE.LOGと私は、すべてのURLリクエストが同じで、彼らはそれはいつもだから、このエラーに

Error: Unexpected request: GET 'data-server/date/2017-09-22' 
Expected GET 'data-server/date/2017-09-21' 

結果更新していないようです見ます最後にhttpBackend.expectGETとなりました。

私には何が欠けていますか?

答えて

0

私の問題はです。です。 私はそれが関連性がなく、複雑さを増したと思ったので私の例から外しましたが、私はmomentJSライブラリを使った日付を作成しました。

ので

var url = 'data-server/date/[i]' 

var url = 'data-server/date/'+factory.getMoment().add(i,'d').format('YYYY-MM-DD'); 

factory.getMomentは一瞬のためだけのラッパー、私はオーバー「が指定を私に提供するために、ユニットテストでこれを乗ることができているという考えです'日付オブジェクト。私のテストでとにかく

funciton getMoment(){ 
    return moment(); 
} 

は、私は、これはと呼ばれることになるたびに、それはこのモックを私に戻って与えることを考えると、この

var mockDate = moment('2017-09-21'); 
spyOn(factory, 'getMoment').and.returnValue(moment('2017-09-21')); 

httpBackend.expectGET('data-server/date/'+mockDate.format('YYYY-MM-DD').respond(mockData[0]); 
httpBackend.expectGET('data-server/date/'+mockDate.add(1,'d').format('YYYY-MM-DD').respond(mockData[1]); 

を持っていた私はそのことについて間違っていたと思います。

私がする必要があったのは、同僚が指摘したように、jasmine's clock mockでした。

beforeEach(function() { 
    jasmine.clock().install(); 
}) 
afterEach(function() { 
    jasmine.clock().uninstall(); 
}) 

はその後、私のテストでは、私は私が私のスパイを削除した

mockDate = moment('2017-09-21'); // always use moment as JS date if badly broken and just can't be trusted! 
jasmine.clock().mockDate(mockDate.toDate()); 

httpBackend.expectGET('data-server/date/'+moment().add(0, 'days').format("YYYY-MM-DD").respond(mockData[0]);; 
httpBackend.expectGET('data-server/date/'+moment().add(1, 'days').format("YYYY-MM-DD").respond(mockData[1]);; 

(上記のループである)で、日付時刻を設定し、今私は、日付を持っており、私の期待通りに働くリクエスト。

これは、テストがうまくいかない理由を把握しようとしている間、頭を何度も掻いている人を助けてくれることでしょう。