2017-09-26 146 views
0

所以在我的工廠中,我有一個請求HTTP調用並將它們添加到承諾數組的循環。 然後我對結果做了$q.all來構建模型。 當我來測試這個,但我不能讓HTTP來做所有的調用,它只做最後一個,我需要它做所有的調用和建立模型。 下面是非常削減代碼,(我用7個日期,但想保持的東西短)單元測試多個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); 
    }); 
} 

所以,當我來測試這個,我有類似的東西(我嘗試了一個循環但失敗了)。

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); 
    }) 

所以我CONSOLE.LOG的get URL,我看到所有的URL請求都是一樣的,他們似乎沒有要更新導致此錯誤

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

,因爲它總是最後httpBackend.expectGET這是採取。

我錯過了什麼?

回答

0

我的問題是嘲諷。 我把這個放在我的例子之外,因爲我認爲它不相關並且增加了複雜性,但是爲了建立我使用momentJS Library的日期。

所以

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]);; 

(以上是在一個循環中)

我已經打消了我的間諜,現在我有日期和請求按我的預期工作。

希望這可以幫助別人發現自己撓了幾天頭,試圖弄清楚爲什麼他們的測試不起作用!