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
的行为取决于哪个范围。