我在开发 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);
然后使用expect和flush进行相同的操作,但是$httpBackend使用旧数据(feedMock)而不是新数据(feedMockUpdated)进行响应。如何使 $httpBackend 在同一请求上响应不同的数据?
最佳答案
您可以使用函数来设置respond
,而不仅仅是静态数据集。
来自文档:
http://docs.angularjs.org/api/ngMock.$httpBackend
respond – {function([status,] data[, headers])|function(function(method, url, data, headers)} – The respond method takes a set of static data to be returned or a function that can return an array containing response status (number), response data (string) and response headers (Object).
据我了解,您的情况是,您希望同一端点在以后的调用中返回不同的数据,您可以尝试如下操作。这只是实现一个简单的计数器,它将在后续调用中切换数据。
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, {}];
}
});
关于AngularJS单元测试: $httpBackend.时动态响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16289368/