2013-02-25 214 views
12

我正在使用Mocha測試返回承諾的異步函數。如何使用摩卡測試承諾

什麼是最好的方式來測試承諾解決了正確的價值?

+0

做一個函數,它接受'it'並返回一個你調用的函數,而不是它自動執行所有這些。你的測試函數需要以'return getSomePromise()' – 2013-02-25 01:43:14

+0

開頭。「當這個斷言失敗時,它會被吞下」。爲了澄清,'value.should.equal'拋出的異常被調用「success」回調的函數捕獲。這是Promises/A +的一個特性,可以確保您始終可以處理承諾鏈末尾的「失敗」回調中的任何錯誤(異常或其他)。 – 2013-04-11 13:59:47

回答

7

摩卡內置了承諾支持爲1.18.0版本(三月2014)。您可以返回從測試情況下的承諾,摩卡會等待它:

it('does something asynchronous', function() { // note: no `done` argument 
    return getSomePromise().then(function(value) { 
    expect(value).to.equal('foo'); 
    }); 
}); 

不要忘記在第二行的return關鍵字。如果您不小心忽略了它,Mocha會假設您的測試是同步的,並且不會等待.then函數,所以即使斷言失敗時您的測試也會始終通過。


如果過於重複,你可能希望使用chai-as-promised庫,它給你一個eventually性質更方便地測試承諾:

it('does something asynchronous', function() { 
    return expect(getSomePromise()).to.eventually.equal('foo'); 
}); 

it('fails asynchronously', function() { 
    return expect(getAnotherPromise()).to.be.rejectedWith(Error, /some message/); 
}); 

再次,不要忘記return關鍵字!

+0

對不起,我有一個簡單的測試'browser.url(..); title = browser.getTitle(); expect(title).to.equal('foo');'我會如何在我的情況下使用'getPromise()'? – Gobliins 2017-08-28 13:14:15

4

然後'返回'可用於處理錯誤的承諾。大多數庫支持稱爲done的方法,這將確保引發任何未處理的錯誤。

it('does something asynchronous', function (done) { 
    getSomePromise() 
    .then(function (value) { 
     value.should.equal('foo') 
    }) 
    .done(() => done(), done); 
}); 

您也可以使用類似mocha-as-promised(還有其他的測試框架類似的庫)。在你的腳本開始

npm install mocha-as-promised 

然後:如果你正在運行的服務器端

require("mocha-as-promised")(); 

如果你正在運行的客戶端:

<script src="mocha-as-promised.js"></script> 

然後你的測試裏面你可以退貨的承諾:

it('does something asynchronous', function() { 
    return getSomePromise() 
    .then(function (value) { 
     value.should.equal('foo') 
    }); 
}); 

或者在咖啡腳本(按你原來的例子)

it 'does something asynchronous',() -> 
    getSomePromise().then (value) => 
    value.should.equal 'foo'