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

AngularJS单元测试:$httpBackend.when动态响应,angularjs,Angularjs,在开发提要(RSS)应用程序时,我正在使用AngularJS单元测试。提要可以获取远程rss数据并对其进行解析并保存解析的项目。为了测试rss抓取,我使用$httpBackend mock: beforeEach(inject(function (_$httpBackend_, _feedMock_, _mockConfig_) { _$httpBackend_.when('GET', _mockConfig_.FEED_URL).respond(_feedMock_); })); 然

在开发提要(RSS)应用程序时,我正在使用AngularJS单元测试。提要可以获取远程rss数据并对其进行解析并保存解析的项目。为了测试rss抓取,我使用$httpBackend mock:

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

$httpBackend.expectGET(mockConfig.FEED_URL);
feed.fetch();
$httpBackend.flush();
它很好用

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

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

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

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

从文档中:

respond–{function([status,]data[,headers])| function(function(method,url,data,headers)}–respond方法获取一组要返回的静态数据,或者获取一个可以返回包含响应状态(number)、响应数据(string)和响应头(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, {}];
    }
});

如果使用Typescript,则必须返回类似[200,feedMock,{}]的内容。我不理解为什么返回值被设计为数组而不是对象