2016-11-22 13 views
0

私はインターン経由でテストする必要のある非同期機能をいくつか持っています。それぞれはES6の約束を使用します。インターン:ES6の約束による非同期ユニットテストのテスト

Internドキュメントでは、約束を返すテスト関数は、その約束が解決されるとすぐに合格します。しかし、私がテストしている非同期関数が解決/拒否されているかどうかだけでなく、解決された値が正しいことを確認することも必要です。

例:私は私の機能を持っている:

function getSomething() { 
    return new Promise((resolve, reject) => { 
    // do some async stuff and resolve when done 
    setTimeout(function() { 
     resolve('the value');  
    }, 1000); 

    }); 
} 

それから私は、テスト方法があります。

tdd.test('getSomething', function() { 
    return new Promise((resolve, reject) => { 
    getSomething().then(function(value) { 
     // I want to resolve/reject the promise BASED ON the assertion -- if the assertion fails, I want to reject the promise; if it succeeds, I want to resolve it 
     assert.equal(value, 'the value', 'getSomething should return "the value".'); 
     resolve(); 
    }); 
    }); 
} 

を、私は、これは動作しません気づいた - アサーションが私のテストに失敗した場合resolve()は呼び出されません。

アサーションを条件に約束を解決/拒否するにはどうすればよいですか?アサーションをtry/catchでラップする必要がありますか?私はこのことについてInternドキュメンテーションのドキュメントを見ていませんでした(そして、ほとんどがES6の約束の代わりにthis.async()を使っていました)。

答えて

3

あなたのコードで起こっていることは、getSomethingコールバックのアサーションが例外をスローしており、resolveが呼び出されないことです。 getSomething約束は拒否されますが、ラッパー約束のイニシャライザーで返信していないので、ラッパー約束は決して解決または拒否されません。

新しい約束でgetSomethingが返す約束をラップする必要はありません。ちょうど直接それを返す。

+0

したがって、テストは単に '' 'getSomething.then(function(){assert( 'whatever')})' ''になりますか?その場合、約束はすでにその点で解決されているので、主張は呼ばれるでしょうか? – Skitterm

+0

はい( 'getSomething()。then' - 括弧を忘れないでください)。 assertは、 'getSomething()'約束が解決した後に呼び出されます。返すものは実際には約束であり、 'then'コールバック(したがってアサーション)が実行されるまでチェーンは解決されないので、これは問題ありません。 ( 'getSomething'約束が拒否されても拒否することもできますが、それでも問題ありません)。 – jason0x43

関連する問題