当没有$scope强制摘要时,如何解决AngularJS、Jasmine 2.0中的承诺?
这似乎是一种承诺。这是愚蠢的,但很好,我有工作在适用的地方(控制器) 我现在所处的情况是,我有一个服务,它可能不太关心应用程序中的任何作用域,它所做的只是从服务器返回一些数据,但承诺似乎没有得到解决当没有$scope强制摘要时,如何解决AngularJS、Jasmine 2.0中的承诺?,angularjs,jasmine,karma-runner,karma-jasmine,Angularjs,Jasmine,Karma Runner,Karma Jasmine,这似乎是一种承诺。这是愚蠢的,但很好,我有工作在适用的地方(控制器) 我现在所处的情况是,我有一个服务,它可能不太关心应用程序中的任何作用域,它所做的只是从服务器返回一些数据,但承诺似乎没有得到解决 app.service('myService', function($q) { return { getSomething: function() { var deferred = $q.defer(); deferred.resolve('test');
app.service('myService', function($q) {
return {
getSomething: function() {
var deferred = $q.defer();
deferred.resolve('test');
return deferred.promise;
}
}
});
测试此功能的正确方法是什么 编辑:供参考的解决方案。显然,即使服务未使用$rootScope,您也必须注入并消化它。
it('should get something', function($rootScope, done) {
var promise = myService.getSomething();
promise.then(function(resp) {
expect(resp).toBe('test');
});
$rootScope.$digest();
done();
});
something.on('ready', function(err) {
$rootScope.$apply(function(){deferred.resolve()});
});
始终存在$rootScope,请使用它
inject(function($rootScope){
myRootScope=$rootScope;
})
....
myRootScope.$digest();
始终存在$rootScope,请使用它
inject(function($rootScope){
myRootScope=$rootScope;
})
....
myRootScope.$digest();
您需要在测试中注入
$rootScope
,并在其上触发$digest
。您需要在测试中注入$rootScope
,并在其上触发$digest
。所以我整个下午都在努力解决这个问题。读了这篇文章后,我也觉得答案有问题;原来是有。以上答案都没有明确解释在何处使用$rootScope.$digest
。这就是我的想法
首先,为什么?无论何时从非角度事件或回调响应,都需要使用$rootScope.$digest
。这将包括纯DOM事件、jQuery事件和其他第三方Promise库,而不是属于angular的$q
第二,在哪里?在代码中,而不是在测试中。不需要在测试中注入$rootScope
,它只在实际的角度服务中需要。这就是上面所有内容无法明确答案的地方,它们显示从测试调用的$rootScope.$digest
我希望这有助于下一个长期以来有同样问题的人
更新
我昨天删除了这篇文章,因为它被否决了。今天,我继续有这个问题,试图使用上面慷慨提供的答案。因此,我以名誉点数为代价保留我的答案,因此,我正在取消删除它 这是非角度事件处理程序所需的,您正在使用$q并尝试使用Jasmine进行测试。
it('should get something', function($rootScope, done) {
var promise = myService.getSomething();
promise.then(function(resp) {
expect(resp).toBe('test');
});
$rootScope.$digest();
done();
});
something.on('ready', function(err) {
$rootScope.$apply(function(){deferred.resolve()});
});
注意,在某些情况下,它可能需要包装在$timeout中
再来一张。在原始问题示例中,您在错误的时间调用了done
。在is解析后,您需要在承诺的然后方法(或捕获
或最终
内部调用完成
)。您在承诺解析之前调用它,这导致it
子句终止
所以我整个下午都在为这件事苦苦挣扎。读了这篇文章后,我也觉得答案有问题;原来是有。以上答案都没有明确解释在何处使用$rootScope.$digest
。这就是我的想法
首先,为什么?无论何时从非角度事件或回调响应,都需要使用$rootScope.$digest
。这将包括纯DOM事件、jQuery事件和其他第三方Promise库,而不是属于angular的$q
第二,在哪里?在代码中,而不是在测试中。不需要在测试中注入$rootScope
,它只在实际的角度服务中需要。这就是上面所有内容无法明确答案的地方,它们显示从测试调用的$rootScope.$digest
我希望这有助于下一个长期以来有同样问题的人
更新
我昨天删除了这篇文章,因为它被否决了。今天,我继续有这个问题,试图使用上面慷慨提供的答案。因此,我以名誉点数为代价保留我的答案,因此,我正在取消删除它
这是非角度事件处理程序所需的,您正在使用$q并尝试使用Jasmine进行测试。
it('should get something', function($rootScope, done) {
var promise = myService.getSomething();
promise.then(function(resp) {
expect(resp).toBe('test');
});
$rootScope.$digest();
done();
});
something.on('ready', function(err) {
$rootScope.$apply(function(){deferred.resolve()});
});
注意,在某些情况下,它可能需要包装在$timeout中
再来一张。在原始问题示例中,您在错误的时间调用了done
。在is解析后,您需要在承诺的然后方法(或捕获
或最终
内部调用完成
)。您在承诺解析之前调用它,这导致it
子句终止
从角度文档
$q
从角度文档
$q
这是可行的,但似乎有点可笑,我希望有其他选择。我想这是Angular团队的一个问题。问题是当前承诺的实现与摘要周期有关(事实上,这是一个很难解决的问题,因为我们在浏览器中没有与nextTick
方法等效的方法)。所以,是的,我担心这是您唯一的选择,只要promise结果的传播与AngularJS中的$digest循环相关联。我尝试过这一点,但现在收到一个“不再需要请求”错误。@pkozlowski.opensource我有一个问题需要从controller获取数据。请您调查一下。你能帮我吗。这是可行的,但似乎有点可笑,我希望有其他选择。我想这是Angular团队的一个问题。问题是当前承诺的实现与摘要周期有关(事实上,这是一个很难解决的问题,因为我们在浏览器中没有与nextTick
方法等效的方法)。所以,是的,我担心这是您唯一的选择,只要promise结果的传播与AngularJS中的$digest循环相关联。我尝试过这一点,但现在收到一个“不再需要请求”错误。@pkozlowski.opensource我有一个问题需要从controller获取数据。请您调查一下。你能帮我吗