在开发Feed(RSS)应用程序时,我正在玩AngularJS单元测试. Feed可以获取远程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();
它工作正常.
但是我需要让Feed通过获取更新的RSS数据并附加新项目来实现它的状态.因此,Feed提出相同的请求,但获得了新的更新数据.我正在尝试通过以下方式重新创建服务器定义:
$httpBackend.when('GET',_mockConfig_.Feed_URL).respond(FeedMockUpdated);
然后使用expect和flush进行相同的操作,但$httpBackend响应旧数据(FeedMock),而不是new(FeedMockUpdated).如何使用$httpBackend响应同一请求中的不同数据?
您可以使用函数设置响应,而不仅仅是静态数据集.
来自文档:
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,headers){ if(RSSCalled === 0) { RSSCalled++; return [200,FeedMock,{}]; } else { return [200,FeedMockUpdated,{}]; } });