为什么必须在测试用例中执行$scope.$apply()
以完成异步处理。
说我有服务
angular.service("a",function($q){
return {
getValue: function(){
return $q.resolve(someObj)
}
}
})
在我的测试中
it("test this",function(done){
a.getValue()
.then(function(data){
expect(data).toEqual(data)
done();
})
$scope.$apply();
})
答案 0 :(得分:4)
它触发了摘要周期。
来自docs:
在测试承诺时,了解分辨率是非常重要的 承诺与摘要周期有关。这意味着一个承诺,那么, catch和finally回调函数仅在摘要后调用 跑了。在测试中,您可以通过调用范围来触发摘要 $ apply函数。如果您的测试中没有范围,则可以 注入$ rootScope并在其上调用$ apply。
对于http调用,使用$ httpBackend.flush()。来自docs,
生产中使用的$ httpBackend始终响应请求 异步。如果我们在单元测试中保留了这种行为,我们就会这样做 必须创建难以编写的异步单元测试 并保持。但测试模拟也无法做出反应 同步;这会改变被测代码的执行。 出于这个原因,模拟$ httpBackend有一个flush()方法,它 允许测试显式刷新挂起的请求。这保留了 后端的异步api,同时允许测试执行 同步。