2013-04-29 56 views
6

在開發Feed(RSS)應用程序時,我正在玩AngularJS單元測試。 Feed可以獲取遠程rss數據,解析它並保存解析的項目。爲了測試RSS獲取我使用$ httpBackend模擬:

beforeEach(inject(function (_$httpBackend_, _feedMock_, _mockConfig_) { 
    _$httpBackend_.when('GET', _mockConfig_.FEED_URL).respond(_feedMock_); 
})); 

,然後在下面

$httpBackend.expectGET(mockConfig.FEED_URL); 
feed.fetch(); 
$httpBackend.flush(); 

它工作正常。

但我需要讓Feed可以通過獲取更新的rss數據並追加新項目來實現它的狀態。所以,Feed會提出相同的請求,但會獲得新的更新數據。我想通過這樣的事情來重新創建服務器定義:

$httpBackend.when('GET', _mockConfig_.FEED_URL).respond(feedMockUpdated); 

,然後進行同樣的操作與預期和沖洗,但$ httpBackend舊數據(feedMock),沒有新的(feedMockUpdated)響應。我怎樣才能使$ httpBackend響應同一請求上的不同數據?

回答

17

您可以使用函數設置respond,而不僅僅是一個靜態數據集。

從文檔:

http://docs.angularjs.org/api/ngMock.$httpBackend

響應 - {函數([狀態,]數據[,標頭])|函數(函數(方法,URL,數據,標頭)} - 的響應方法採用一組靜態數據要返回或函數可以返回包含響應狀態(號碼),響應數據(字符串)和響應標頭(對象)的陣列。

因此,正如我在瞭解您情況下,你想要有同樣的結局點在稍後的調用上返回不同的數據,你可以嘗試如下所示。這只是實現一個簡單的計數器,將在後續的通話中切換數據。

var rssCalled = 0; 

$httpBackend.when('GET', _mockConfig_.FEED_URL).respond(function(method, url, data, headers){ 
    if(rssCalled === 0) { 
     rssCalled++; 
     return [200, feedMock, {}]; 
    } else { 
     return [200, feedMockUpdated, {}]; 
    } 
}); 
+0

如果您使用的打字稿,你將不得不返回類似[ 200, feedMock, {}]。我不明白爲什麼返回值被設計成一個數組而不是一個對象 – rob 2013-06-09 20:03:35