Javascript 使用承诺的Jasmine异步测试
我正在用角度承诺做一些茉莉花测试,有一个关于时间的问题。在这里找到了答案,但需要澄清它是如何工作的。假设Javascript 使用承诺的Jasmine异步测试,javascript,angularjs,unit-testing,jasmine,Javascript,Angularjs,Unit Testing,Jasmine,我正在用角度承诺做一些茉莉花测试,有一个关于时间的问题。在这里找到了答案,但需要澄清它是如何工作的。假设then方法总是以异步方式处理,那么如何保证下面的测试通过呢。是否存在expect将在执行然后块之前运行并在赋值之前运行expect的风险。或摘要循环是否保证在expect运行之前分配值。这意味着,摘要循环将有效地表现为阻塞调用,保证在允许代码继续之前,承诺都已解决 function someService(){ var deferred = $q.defer(); deferred.
then
方法总是以异步方式处理,那么如何保证下面的测试通过呢。是否存在expect
将在执行然后块之前运行并在赋值之前运行expect的风险。或摘要循环是否保证在expect运行之前分配值。这意味着,摘要循环将有效地表现为阻塞调用,保证在允许代码继续之前,承诺都已解决
function someService(){
var deferred = $q.defer();
deferred.resolve(myObj);
return deferred.promise;
}
it ('testing promise', function() {
var res;
var res2;
someService().then(function(obj){
res = "test";
});
someService().then(function(obj){
res2 = "test2";
});
$rootScope.$apply();
expect(res).toBe('test');
expect(res2).toBe('test2');
});
摘要循环将有效地表现为一个阻塞调用,它保证在允许代码继续之前,承诺都已解决
function someService(){
var deferred = $q.defer();
deferred.resolve(myObj);
return deferred.promise;
}
it ('testing promise', function() {
var res;
var res2;
someService().then(function(obj){
res = "test";
});
someService().then(function(obj){
res2 = "test2";
});
$rootScope.$apply();
expect(res).toBe('test');
expect(res2).toBe('test2');
});
是的,但更准确地说,这将保证成功收回已解决的承诺
有一个非常相似的虽然Michal的回答指出了正确的想法,但这里的关键是在相关范围内调用了$apply()
。以下是角度文档中的示例:
it('should simulate promise', inject(function($q, $rootScope) {
var deferred = $q.defer();
var promise = deferred.promise;
var resolvedValue;
promise.then(function(value) { resolvedValue = value; });
expect(resolvedValue).toBeUndefined();
// Simulate resolving of promise
deferred.resolve(123);
// Note that the 'then' function does not get called synchronously.
// This is because we want the promise API to always be async, whether or not
// it got called synchronously or asynchronously.
expect(resolvedValue).toBeUndefined();
// Propagate promise resolution to 'then' functions using $apply().
$rootScope.$apply();
expect(resolvedValue).toEqual(123);
}));
回答得很好。谢谢我认为这不准确。根据您从哪个范围调用$apply
,行为不会有任何差异。但是,$digest
的行为取决于哪个范围。