Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 角度测试用例$scope.$apply_Angularjs_Unit Testing_Jasmine - Fatal编程技术网

Angularjs 角度测试用例$scope.$apply

Angularjs 角度测试用例$scope.$apply,angularjs,unit-testing,jasmine,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(funct

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

它触发了消化循环

从:

在测试承诺时,重要的是要知道 承诺与消化周期息息相关。那就意味着一个承诺, catch和finally回调函数仅在摘要之后调用 他跑了。在测试中,您可以通过调用作用域的 $apply函数。如果测试中没有范围,可以 注入$rootScope并对其调用$apply

对于http调用,使用$httpBackend.flush()。从

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


它触发了消化循环

从:

在测试承诺时,重要的是要知道 承诺与消化周期息息相关。那就意味着一个承诺, catch和finally回调函数仅在摘要之后调用 他跑了。在测试中,您可以通过调用作用域的 $apply函数。如果测试中没有范围,可以 注入$rootScope并对其调用$apply

对于http调用,使用$httpBackend.flush()。从

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


感谢您的回答@scott您能详细说明为什么在我不更改作用域上的任何内容的情况下,承诺需要一个摘要周期来运行。由此可知:当承诺得到解决时,它的回调不会立即调用。相反,Angular将promise.resolve回调放在evalAsync队列上。他们在那里等待队列被处理。只有这样才会调用回调。处理队列的是digest()方法。感谢您的回答@scott您能详细说明为什么在我不更改作用域上的任何内容的情况下,承诺需要一个摘要循环才能运行。由此可知:当承诺被解析时,它的回调不会立即被调用。相反,Angular将promise.resolve回调放在evalAsync队列上。他们在那里等待队列被处理。只有这样才会调用回调。处理队列的是digest()方法。