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

ard*_*m-c 6 angularjs

在开发Feed(RSS)应用程序时,我正在玩AngularJS单元测试.Feed可以获取远程rss数据解析它并保存已解析的项目.为了测试rss提取我使用$ httpBackend mock:

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

然后在下面

$httpBackend.expectGET(mockConfig.FEED_URL);
feed.fetch();
$httpBackend.flush();
Run Code Online (Sandbox Code Playgroud)

它工作正常.

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

$httpBackend.when('GET', _mockConfig_.FEED_URL).respond(feedMockUpdated);
Run Code Online (Sandbox Code Playgroud)

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

Ale*_*orn 17

您可以respond使用函数进行设置,而不仅仅是静态数据集.

来自文档:

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

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

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

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, {}];
    }
});
Run Code Online (Sandbox Code Playgroud)