[解決済み] mocha/chaiを使用したテスト時にUnhandledPromiseRejectionWarningが発生する
質問
イベントエミッターに依存するコンポーネントをテストしています。そのために、Mocha+ChaiでPromisesを使った解決策を思いつきました。
it('should transition with the correct event', (done) => {
const cFSM = new CharacterFSM({}, emitter, transitions);
let timeout = null;
let resolved = false;
new Promise((resolve, reject) => {
emitter.once('action', resolve);
emitter.emit('done', {});
timeout = setTimeout(() => {
if (!resolved) {
reject('Timedout!');
}
clearTimeout(timeout);
}, 100);
}).then((state) => {
resolved = true;
assert(state.action === 'DONE', 'should change state');
done();
}).catch((error) => {
assert.isNotOk(error,'Promise error');
done();
});
});
コンソールでは、拒否関数が呼ばれているにもかかわらず、「UnhandledPromiseRejectionWarning」が表示されます。これは、「AssertionError.Promise」というメッセージが即座に表示されるためです。Promise error' と表示されます。
(node:25754) UnhandledPromiseRejectionWarning: 未処理の約束 拒否されました (拒否 ID: 2)。AssertionError: プロミスエラー: 期待される {オブジェクト (メッセージ、showDiff、...) } が偽者であること。
- は正しいイベントで遷移する必要があります。
そして、2秒後に
エラー: タイムアウト2000msを超えました。done() コールバックが実行されていることを確認してください。 がこのテストで呼び出されています。
キャッチコールバックが実行されたので、さらに奇妙です(何らかの理由でアサートの失敗が残りの実行を妨げたのだと思います)
さて、おかしなことに、もし私が
assert.isNotOk(error...)
を実行すると、コンソールに警告が表示されることなく、テストは正常に実行されます。しかし、catchを実行するという意味では、まだ「失敗」しています。
それにしても、このpromiseでのエラーは理解できません。どなたか教えていただけませんか?
どのように解決するのですか?
この問題が発生する原因はこれです。
.catch((error) => {
assert.isNotOk(error,'Promise error');
done();
});
アサーションに失敗した場合は、エラーをスローします。このエラーは
done()
なぜなら、その前にコードがエラーになったからです。これがタイムアウトの原因です。
その
"Unhandled promise rejection"
はアサーションに失敗したことも原因です。
catch()
ハンドラを使用します。
がなく、その後に続く
catch()
ハンドラ
で説明されているように)、エラーは飲み込まれます。
この記事
). その
UnhandledPromiseRejectionWarning
の警告は、この事実を警告しているのです。
一般的に、Mocha でプロミスベースのコードをテストしたい場合、Mocha 自体がすでにプロミスを扱えるという事実に頼るべきです。を使うべきではありません。
done()
代わりに、テストからプロミスを返します。そうすれば、Mocha が自らエラーをキャッチしてくれるでしょう。
こんな感じで。
it('should transition with the correct event', () => {
...
return new Promise((resolve, reject) => {
...
}).then((state) => {
assert(state.action === 'DONE', 'should change state');
})
.catch((error) => {
assert.isNotOk(error,'Promise error');
});
});
関連
-
[解決済み] Uncaught Invariant Violation: 前のレンダリング中よりも多くのフックをレンダリングした
-
[解決済み】XMLHttpRequestモジュールが定義されていない/見つからない
-
[解決済み] テスト
-
[解決済み】JavaScript ランタイムエラー:'$'が未定義です。
-
[解決済み】Redux TypeError: 未定義のプロパティ 'apply' を読み取れない
-
[解決済み】JS ファイルが net::ERR_ABORTED 404 (Not Found) を取得する)
-
[解決済み】Babel NodeJS ES6: SyntaxError: 予期しないトークンのエクスポート
-
[解決済み】'useState' が定義されていない no-undef React
-
[解決済み】Mocha / Chai expect.to.throwがスローエラーをキャッチしない
-
[解決済み] モカやチャイを使った約束事を正しくテストするにはどうしたらいいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】パッシブイベントリスナー内部でpreventDefaultができない
-
[解決済み】別のjsファイル内でJavaScriptの関数を呼び出す
-
[解決済み] [Solved] Uncaught TypeError: nullのプロパティ 'appendChild' を読み取ることができない。
-
[解決済み] エラー。モジュールhtmlが見つからない
-
[解決済み】JavaScript ランタイムエラー:'$'が未定義です。
-
[解決済み】npm install --legacy-peer-deps は具体的に何をするのですか?どんなときに推奨されるのか/どんな使用例が考えられるのか?
-
[解決済み】JS ファイルが net::ERR_ABORTED 404 (Not Found) を取得する)
-
[解決済み】XMLパースエラー:ルート要素が見つからない コンソールの場所 FF
-
[解決済み】FirefoxでGoogle Maps V3をリモートで使用すると「googleが定義されていません」と表示される。
-
[解決済み】 \u003C とは何ですか?