AngularJS单元测试: $httpBackend.时动态响应

标签 angularjs

我在开发 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/

相关文章:

angularjs - ionic socket 设置不起作用

javascript - $scope.$apply() 调用是否适合这种情况?

javascript - Angular 引导 ui 模态

javascript - Angular : Best way to keep data in a factory updated?

AngularJS多复选框疑惑(Angular Material)

javascript - 为什么我从 json 获取数据时遇到未定义的情况?

angularjs - LoopBack Angular SDK 的 upsert 在 PATCH 中包含 ID,导致错误

jquery - 如何在Angularjs中使用第三方js

javascript - Angularjs删除奇偶选定行中具有不同背景颜色的表行

angularjs - 删除#字符导致应用程序无法在 Angular 中正常工作