2015-03-02 115 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();調用,該調用已經存在,然後刷新第二個超時,解決第二個承諾,並記錄丟失的消息。