javasciptで非同期関数を処理する同期関数のテストをしたい
はじめに
テストツールはjestです。
テストしたいコード
export let text = "hoge";
const asyncFunc = async () => {
await new Promise((resolve) => {
console.log(text);
// hoge
resolve();
});
text = "fuga";
console.log(text);
// fuga
};
const testFunc = () => {
asyncFunc();
console.log(text);
// hoge
};
export default testFunc;
testFunc
の中で非同期関数のasyncFunc
が実行されています。
testFunc
が実行されると、非同期でtext
の値がhoge
からfuga
に変わることをテストしたい。
テストコード
失敗例
test("testFunc", async () => {
testFunc();
expect(text).toBe("fuga");
});
このテストだと失敗します。
text="fuga"
を実行しているasyncFunc
が非同期だからですね。
成功例
test("testFunc", async () => {
testFunc();
expect(text).not.toBe("fuga");
return new Promise((resolve) => setImmediate(resolve)).then(() => {
expect(text).toBe("fuga");
});
});
これでテストが成功します。
Promiseを返すと、jestはPromiseが解決されるまで待機します。
つまり、setImmediate
が終わった後にexpect(text).toBe("fuga")
が実行されているということになります。
なぜ、setImmediateなのか
jestはNode.jsで動作しています。
Node.jsのイベントループでは、setImmediate
が最後に実行されます。
Node.jsのイベントループについてはこちらを参照
https://blog.hiroppy.me/entry/nodejs-event-loop
Author And Source
この問題について(javasciptで非同期関数を処理する同期関数のテストをしたい), 我々は、より多くの情報をここで見つけました https://qiita.com/islandryu/items/af479064a010ba762bee著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .