Promise
的狀態轉化,並非難以理解的概念。可是,在寫測試用例的時候,可能會掉進坑裏。此處爲我的記錄。git
var should = require('should'); describe('promise assert', function () { it('normal assert', function (done) { var first = Promise.resolve('A'); first.then(function(value) { value.should.equal('A'); done(): }) }); it('timeout assert', function (done) { var first = Promise.resolve('A'); first.then(function(value) { value.should.equal('AB'); done(); }) }); });
上述爲最開始寫的測試用例,理所固然的覺得第一個pass
,第二個fail
。結果是第一個pass
,第二個timeout error
。因爲暫時性短路,沒有發現問題所在,後在repo詢問後得知結果。github
每個斷言,失敗後會throw error
,不會繼續往下執行,而後then
方法會返回一個rejected promise
,於是done
方法不會被調用,因此會出現timeout error
。promise
詢問以後,mocha
最新版本已經支持基於promise
的斷言,而再也不依賴done
回調函數。代碼修改以下:函數
var should = require('should'); describe('promise assert', function () { it('normal assert', function () { var first = Promise.resolve('A'); return first.then(function(value) { value.should.equal('A'); }) }); it('timeout assert', function () { var first = Promise.resolve('A'); return first.then(function(value) { value.should.equal('AB'); }) }); });
此時,斷言結果如預期。測試
QQ:491229492
https://github.com/bornkillerui