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

它工作正常。

但是我需要通过获取更新的 rss 数据和附加新项目来使 Feed 可以实现它的状态。因此,Feed 发出了相同的请求,但得到了新的更新数据。我正在尝试通过以下方式重新创建服务器定义:

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

然后使用 expect 和 flush 进行相同的操作,但 $httpBackend 使用旧数据 (feedMock) 响应,而不是新数据 (feedMockUpdated)。如何使 $httpBackend 响应同一请求的不同数据?

4

1 回答 1

17

您可以设置respond一个函数,而不仅仅是一个静态数据集。

从文档:

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

响应 – {function([status,] data[, headers])|function(function(method, url, data, headers)} – 响应方法接受一组要返回的静态数据或一个可以返回数组的函数包含响应状态(数字)、响应数据(字符串)和响应标头(对象)。

因此,据我所知,您希望相同的端点在以后的调用中返回不同的数据,您可以尝试以下操作。这只是实现一个简单的计数器,它将在后续调用中切换数据。

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, {}];
    }
});
于 2013-04-29T23:29:39.100 回答