2015-04-23 161 views
0

我們都知道,當我回報摩卡的承諾時,它會測試承諾。如何在摩卡中測試承諾

但是,如果它在承諾中拋出異常,如何判斷異常是否拋出。也就是說,如果異常是有保證的,那麼測試通過。

it("Should not take game code for the same user twice", function (done) { 
    return gameGiftManage.takeGameCode(gameGiftId, userId) 
     .catch(function (e) { 
      expect(e).to.exist; 
      done(); 
     }) 
}) 

這是我用來測試異常的測試,但它在某些情況下不起作用。

takeGameCode:

takeGameCode: function (giftId, userId) { 
    return GameGiftCode.count({gift: giftId, user: userId}).exec().then(function (c) { 
     if (c) { 
      throw '該用戶已經領取過禮包'; 
     } 
    }).then(function() { 
     return GameGiftCode.findOneAndUpdate({gift: giftId, user: {$exists: false}}, {user: userId}).exec(); 
    }).then(function (a) { 
     if (!a) { 
      throw '禮包領完了'; 
     } else { 
      return a; 
     } 
    }); 
}, 
+1

在你的承諾中..你使用throw()還是reject()? –

+0

@JamesLeClair扔 –

回答

1

而不是使用拋,當你的承諾出現錯誤使用拒絕。這就是它的目的。它會觸發您試圖斷言的.catch()。另外,爲了簡單起見,不建議僅僅拒絕()(這基本上就像說throw未定義)。拒絕(新的錯誤(「有意義的事情在這裏」)會產生更一致的結果和更好的測試套件每次。

繼承人一個偉大的文章去多一點的深度與一些最新的及原因,http://making.change.org/post/69613524472/promises-and-error-handling

編輯:現在你發佈了一些上下文,看起來這是在貓鼬的使用範圍內,他們的文檔有一個很好的例子,說明如何使用promise來處理錯誤,而不是使用.catch() ()看到this link

所以,而不是.catch(),你想

.then(null, function(error){ //handle assertion })

+0

拋出一個錯誤也會導致catch被調用。即使我使用拒絕,那麼我仍然不知道如何在摩卡測試。 –

+1

是的,我看到你的編輯主要職位..工作在我的評論修訂..對不起。在我修改 –

+0

之前,先試用一下測試。感謝您的鏈接。 –