2017-01-29 84 views
1

我有一個小測試(摩卡/柴),測試了encryptPass函數返回正確的散列:使用Promise.all與斷言

const assert = require('chai').assert; 
const bcrypt = require('bcrypt'); 
var encryptPass = require('../../shared/helpers/encryptPass.js'); 
var createUUID = require('../../shared/helpers/createUUID.js'); 

describe('encryptPass', function() { 
    it('returns correct password hash',() => { 
     var pass = createUUID(); 
     var encryptedPass = encryptPass(pass); 
     Promise.all([pass, encryptedPass]).then(values => { 
      let [pass, encryptedPass] = values; 
      var compareResult = bcrypt.compareSync(pass, encryptedPass); 
      assert.equal(compareResult, true); 
     }); 
    }); 
}); 

我擔心的是,有是斷言是假設Promise.all函數將工作而不會拋出錯誤。如何最好地處理這個問題?

回答

2

剛剛返回,從您的測試結果的承諾:

it('returns correct password hash',() => { 
    var pass = createUUID(); 
    var encryptedPass = encryptPass(pass); 
    // Just return... 
    return Promise.all([pass, encryptedPass]).then(values => { 
     let [pass, encryptedPass] = values; 
     var compareResult = bcrypt.compareSync(pass, encryptedPass); 
     assert.equal(compareResult, true); 
    }); 
}); 

這將需要告訴摩卡您的測試是異步的照顧。在您的原始代碼中,Mocha不會等待測試完成。回覆諾言迫使它等待。其次,通過回覆承諾,您還可以控制測試是否成功。如果任何傳遞給Promise.all的承諾被拒絕,那是一個測試失敗。如果.then處理程序中的代碼失敗,那也是測試失敗。例如,如果assert.equal失敗,則會產生AssertionError,這會導致承諾拒絕,而Mocha會將其視爲失敗。