这似乎是对$scope.$digest()
的承诺。这是愚蠢的海事组织,但很好,我有工作,在适当的地方(控制器)。
现在我所处的情况是,我有一个服务,它可以不关心应用程序中的任何作用域,它所做的只是从服务器返回一些数据,但是这个承诺似乎并没有得到解决。
app.service('myService', function($q) {
return {
getSomething: function() {
var deferred = $q.defer();
deferred.resolve('test');
return deferred.promise;
}
}
});
describe('Method: getSomething', function() {
// In this case the expect()s are never executed
it('should get something', function(done) {
var promise = myService.getSomething();
promise.then(function(resp) {
expect(resp).toBe('test');
expect(1).toEqual(2);
});
done();
});
// This throws an error because done() is never called.
// Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.
it('should get something', function(done) {
var promise = myService.getSomething();
promise.then(function(resp) {
expect(resp).toBe('test');
expect(1).toEqual(2);
done();
});
});
});
测试此功能的正确方法是什么?
编辑:供参考的解决方案。显然,即使服务没有使用$rootScope,您也不得不注入和消化它。
it('should get something', function($rootScope, done) {
var promise = myService.getSomething();
promise.then(function(resp) {
expect(resp).toBe('test');
});
$rootScope.$digest();
done();
});
发布于 2014-06-03 09:11:24
您需要在测试中注入$rootScope
并在其上触发$digest
。
发布于 2014-06-03 09:10:55
总是有$rootScope,使用它
inject(function($rootScope){
myRootScope=$rootScope;
})
....
myRootScope.$digest();
发布于 2015-06-14 17:17:31
所以我整个下午都在为这件事而挣扎。读了这篇文章后,我也觉得答案有些不妥,原来是这样的。上述任何一个答案都没有给出一个明确的解释,在哪里和为什么使用$rootScope.$digest
。这就是我想出来的。
首先为什么?当您从非角度事件或回调响应时,您需要使用$rootScope.$digest
。这将包括纯DOM事件、jQuery事件和其他第三方承诺库,而不是$q
的一部分。
第二,在哪里?在你的代码里,而不是你的测试中。没有必要将$rootScope
注入到测试中,它只需要在实际的角度服务中使用。这就是上面所有的内容都无法说明答案的地方,它们显示$rootScope.$digest
是从测试中调用的。
我希望这能帮助下一个长时间有同样问题的人。
更新
昨天被否决后,我删除了这篇文章。今天,我继续有这个问题,试图使用上述的答案,慷慨提供。因此,我以声誉点为代价来准备我的答案,因此,我要删除它。
--这是您在非角度事件处理程序中所需要的,您正在使用$q并尝试使用Jasmin.进行测试。
something.on('ready', function(err) {
$rootScope.$apply(function(){deferred.resolve()});
});
注意,在某些情况下,它可能需要包装在$timeout中。
something.on('ready', function(err) {
$timeout(function(){
$rootScope.$apply(function(){deferred.resolve()});
});
});
再来一个音符。在最初的问题示例中,您在错误的时间调用了
done
。您需要在承诺的done
的then
方法(或catch
或finally
)中调用它,然后再进行解析。在承诺解决之前调用它,这将导致it
子句终止。
https://stackoverflow.com/questions/24021031
复制相似问题