2015-03-02 142 views
2

我有一个测试,需要一个承诺运行和后来在其then处理程序另一个承诺返回功能运行。茉莉花2.0测试与嵌套的角度承诺

第一个承诺解决了,并且成功调用了返回承诺的下一个函数。然而,第二个承诺的处理程序永远不会触发。

是否有另一种方法来测试使用Jasmine 2.0的嵌套承诺?

例题:

describe("nested promise suite", function() { 
     var prom1 = function() { 
      var deferred = $q.defer(); 
      $timeout(function() { 
       deferred.resolve('prom1'); 
      }, 500) 
      return deferred.promise; 
     }; 

     var prom2 = function() { 
      var deferred = $q.defer(); 
      $timeout(function() { 
       deferred.resolve('prom2'); 
      }, 500); 
      return deferred.promise; 
     }; 

     iit("nested promise test", function (done) { 
      prom1() 
       .then(function (result) { 
        console.log('prom1 result ', result); 
        prom2() 
         .then(function (result2) { 
          console.log('prom2 result ', result2); 
         }) 
         .finally(function() { 
          console.log('you did it'); 
         }) 
       }) 
       .finally(done); //this causes promise one to resolve properly but unsure of how to make the second promise resolve properly 
      $timeout.flush(); 
     }) 
    }); 
+0

你应该总是从'then()'回调函数返回你的承诺。 – Bergi 2015-03-03 12:36:09

+0

请勿使用[deferred antipattern](http://stackoverflow.com/q/23803743/1048572)! ['$ timeout'](https://docs.angularjs.org/api/ng/service/$timeout)已经返回一个承诺。 – Bergi 2015-03-03 12:38:44

回答

1

我不知道,如果这是你的原代码的问题为好,但在这个例子中,你的第二个的console.log不火,因为prom2增加了一个新的第一次刷新后超时。从prom2的承诺,然后等待这个新的超时冲洗,这永远不会发生:

  1. prom1()
  2. 第一承诺和超时创建
  3. 第一超时被刷新,解决第一个承诺
  4. 当时()块被触发时,主叫prom2()
  5. 第二承诺和超时创建
  6. done()被调用。

您可以尝试添加第二个$timeout.flush();调用,该调用已经存在,然后刷新第二个超时,解决第二个承诺,并记录丢失的消息。