我正在尝试测试我的服务正在使用缓存的GET请求。
愚蠢的测试版本:
var url = "/test";
var whenTestRequest = $httpBackend.when('GET', url);
whenTestRequest.respond(200, "r1");
$http({ url: url, method: 'GET', cache: true }).success(function (value) {
expect(value).toBe("r1");
});
$httpBackend.flush();
whenTestRequest.respond(200, "r2");
$http({ url: url, method: 'GET', cache: true }).success(function (value) {
expect(value).toBe("r1");
});
$httpBackend.flush();
我需要第二个$httpBackend.flush()
,以便调用我的第二个success
函数,但第二次调用flush
会抛出:
错误:没有待处理的待处理请求!
所以我需要将flush
包裹在try
/ catch
中。这有效,但有没有正确的处理方法?
答案 0 :(得分:0)
我认为我找到了解决方法 - 而不是致电$httpBackend.flush()
,请致电$rootScope.$digest()
。这是flush
最终在后台执行的操作,除非不检查是否有任何待处理请求,并且它会导致解析缓存满足的$ http请求的承诺。< / p>
当我将我的项目切换到模板缓存中存储指令模板而不是为每个模板执行http请求时,我遇到了这个问题。我的旧测试创建了这样的指令:
beforeEach(inject(function($compile, $rootScope, $httpBackend) {
$httpBackend.expectGET('login.html').respond('<div></div>');
$compile('<login-page/>')($rootScope);
$httpBackend.flush();
}));
但是,当我将测试切换为使用模板时,flush会抛出该异常,因为缓存满足了请求,并且从未进入虚拟线路。但即使在删除了$ httpBackend之后,该指令仍然没有构建,因为templateUrl
导致整个指令init进程在then
调用请求的承诺中模板。即使缓存满足模板请求,代码仍然会在$http
调用的大部分时间内完成,但由于请求不会在$httpBackend
期望的缓存中结束,因此并不是让承诺链实际运行的明显方式。
经过一些调查和测试后,发现$rootScope.$digest()
将导致承诺运行,因此将代码更改为:
beforeEach(inject(function($compile, $rootScope) {
$compile('<login-page/>')($rootScope);
$rootScope.$digest();
}));
这允许beforeEach
运行,并且指令实际上已经构建,允许其余的测试继续正常。