私はインターン経由でテストする必要のある非同期機能をいくつか持っています。それぞれは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()を使っていました)。
したがって、テストは単に '' 'getSomething.then(function(){assert( 'whatever')})' ''になりますか?その場合、約束はすでにその点で解決されているので、主張は呼ばれるでしょうか? – Skitterm
はい( 'getSomething()。then' - 括弧を忘れないでください)。 assertは、 'getSomething()'約束が解決した後に呼び出されます。返すものは実際には約束であり、 'then'コールバック(したがってアサーション)が実行されるまでチェーンは解決されないので、これは問題ありません。 ( 'getSomething'約束が拒否されても拒否することもできますが、それでも問題ありません)。 – jason0x43