角度测试用例$ scope。$ apply

时间:2016-09-01 04:59:06

标签: angularjs unit-testing jasmine

为什么必须在测试用例中执行$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();
})

1 个答案:

答案 0 :(得分:4)

它触发了摘要周期。

来自docs

  

在测试承诺时,了解分辨率是非常重要的   承诺与摘要周期有关。这意味着一个承诺,那么,   catch和finally回调函数仅在摘要后调用   跑了。在测试中,您可以通过调用范围来触发摘要   $ apply函数。如果您的测试中没有范围,则可以   注入$ rootScope并在其上调用$ apply。

对于http调用,使用$ httpBackend.flush()。来自docs

  

生产中使用的$ httpBackend始终响应请求   异步。如果我们在单元测试中保留了这种行为,我们就会这样做   必须创建难以编写的异步单元测试   并保持。但测试模拟也无法做出反应   同步;这会改变被测代码的执行。   出于这个原因,模拟$ httpBackend有一个flush()方法,它   允许测试显式刷新挂起的请求。这保留了   后端的异步api,同时允许测试执行   同步。