我有一个名为Songs
的工厂,它每秒从API获取歌曲:
angular.module('pearlJam')
.factory('Songs', function($http, $timeout, Config){
var response = {list: []};
var onSuccess = function(result){
response.list = result.data.data;
$timeout(poller, Config.pollingTimeout);
};
var poller = function(){
$http.get('api/songs.json', Config.httpOptions).then(onSuccess);
};
poller();
return {all: response};
});
我想测试一下,我尝试过它但是我认为我以错误的方式注入服务。当我尝试运行测试时,它输出错误:没有待处理的冲洗请求!。就好像它没有进行http调用。
describe('Songs', function(){
var httpStub, localService;
beforeEach(module('pearlJam'));
beforeEach(inject(function(_$httpBackend_, Songs){
httpStub = _$httpBackend_;
localService = Songs;
}));
it('lists all songs', function(){
var httpResponse = { data: [1]};
httpStub.whenGET('api/songs.json').respond(httpResponse);
var serviceResponse = localService.all;
httpStub.flush();
expect(serviceResponse).toBe([1]);
});
});
答案 0 :(得分:2)
expectGET创建一个新的期望值,告诉angular在向/api/songs.json发出GET请求时响应给定的对象。它只是注册它应该做的但是没有在这里发出GET请求。
因为您立即在服务中调用了轮询器功能,所以在加载服务时将触发http请求。
您必须在触发http请求之前(即在加载服务之前)存根响应。加载pearlJam模块 - >用expectGET注册期望 - >加载歌曲服务
在这里,我将您的代码拆分为最重要的部分,但重新注入Config和$ timeout服务也应该正常工作http://plnkr.co/edit/lbkxjTJbEjEXIzbyNPVF?p=preview
答案 1 :(得分:1)
$httpBackend.flush()
方法仅适用于expectGET
之类的请求预期。
whenGET
方法允许您模拟后端并劫持请求以响应特殊内容,但它不计入刷新。
如果你毫无期望地致电flush()
,它会引发你遇到的错误。