2013-02-25 13 views
12

私はMochaを使って約束を返す非同期関数をテストしています。Mochaで約束をテストする方法

約束事が正しい値に解決されることをテストする最良の方法は何ですか?

+0

'it'を取り込み、これを自動的に行う代わりにあなたが呼び出す関数を返す関数を作ります。あなたのテスト関数は 'return getSomePromise()'で始める必要があります –

+0

"このアサーションが失敗すると、それは飲み込まれます"。明確にするために、 'value.should.equal'がスローする例外は、"成功 "コールバックを呼び出す関数によって捕捉されます。これは、Promises/A +の機能で、プロミスチェーンの最後にある "失敗"コールバックでエラー(例外など)を常に処理できることを保証します。 –

答えて

7

モカは組み込まれていプロミスサポートバージョン1.18.0(2014年3月)のよう。あなたは、テストケースからの約束を返すことができ、そしてモカはそれを待っています:

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

二行目にreturnキーワードを忘れないでください。誤って省略すると、Mochaはテストが同期であるとみなし、.then関数を待たずに、アサーションが失敗した場合でもテストは必ず終了します。


これも繰り返し取得した場合、あなたはあなたにもっと簡単に約束をテストするeventuallyプロパティを与えるchai-as-promisedライブラリ、使用したいことがあります。ここでも

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(..);タイトル= browser.getTitle(); expect(title).to.equal( 'foo'); '私の場合、どのように' getPromise() 'を使うのですか? – Gobliins

4

次に、エラーを処理するために使用できる約束を「返す」。ほとんどのライブラリでは、doneというメソッドがサポートされており、未処理のエラーがスローされます。

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

また、(他のテストフレームワークのための同様のライブラリがあります)mocha-as-promisedのようなものを使用することができます。あなたのテストの内側その後

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

:あなたはクライアント側を実行している場合

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

:次に

npm install mocha-as-promised 

スクリプトの開始時:あなたは、サーバー側を実行している場合約束を返すことができます:

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' 
関連する問題