[解決済み] テスト
質問
最近、私は
Mocha+Chai
フレームワークを使用して、event-emitter に依存するコンポーネントをテストしています。
Promise
を、次のようなコードで記述します。
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 error
(node:25754) UnhandledPromiseRejectionWarning。Unhandled Promise Rejection (rejection id: 2)です。AssertionError: Promise error: expect { Object (message, showDiff, ...) } to be falsy
- は正しいイベントで遷移する必要があります。
そして、2秒後に
エラー: タイムアウト2000msを超えました。このテストでは、done()コールバックが呼び出されていることを確認してください。
キャッチコールバックが実行されたので、さらに奇妙なことになりました。
をコメントアウトすると
assert.isNotOk(error...)
を実行すると、コンソールに警告が表示されることなく、テストは正常に実行されます。しかし、catchを実行するという意味では、まだ「失敗」しています。
解決方法は?
この問題が発生する原因はこれです。
.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');
});
});
関連
-
親子コンポーネント通信を解決する3つのVueスロット
-
Vueのイベント処理とイベントモディファイアの解説
-
[解決済み】SyntaxError: JSONの位置1に予期しないトークンoがある。
-
[解決済み】Node.jsで "Cannot find module "エラーを解決するには?
-
[解決済み】TypeErrorの解決方法。未定義またはヌルをオブジェクトに変換できない
-
[解決済み】ERROR エラーです。スイッチのname属性が指定されていないフォームコントロールの値アクセッサがない
-
[解決済み】(Google Map API) Geocodeは以下の理由で成功しませんでした。REQUEST_DENIED
-
JavaScriptのgetElementById()メソッド入門
-
[解決済み】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 実装 サイバーパンク風ボタン
おすすめ
-
JavaScriptの関数この指摘の問題を説明
-
vue3.0プロジェクトのアーキテクチャを構築するための便利なツール
-
Vueのフィルタの説明
-
[解決済み】React - uncaught TypeError: 未定義のプロパティ 'setState' を読み取れない
-
[解決済み】ローカルファイルを開くことができません - Chrome: ローカルリソースの読み込みが許可されていない
-
[解決済み】Node.jsで "Cannot find module "エラーを解決するには?
-
[解決済み】ExpressJS - throw er Unhandled errorイベント
-
[解決済み】JavaScriptでインラインIF文の書き方は?
-
nodejs unhandledPromiseRejectionWarning メッセージ
-
nullのプロパティinnerHTMLを読み取れません エラーメッセージ