乐闻世界logo
搜索文章和话题

How to make Jest wait for all asynchronous code to finish execution before expecting an assertion

1个答案

1

When performing unit tests with Jest for asynchronous code, it is crucial to ensure that all asynchronous operations complete before executing expect assertions. This can be achieved through several methods:

1. Using done Callback

Jest provides a done callback function that can be used within test functions. When you call done() in an asynchronous test, Jest knows that your asynchronous operations have completed, and you can safely execute assertions afterward.

Example code:

javascript
test('Asynchronous Test Example with done', done => { setTimeout(() => { expect(true).toBe(true); done(); }, 1000); });

In this example, done() is called within the setTimeout callback to signal Jest that the asynchronous code has completed.

2. Returning a Promise

If your function returns a Promise, Jest will wait for this Promise to resolve before continuing with the test. This approach is convenient for handling Promise-based asynchronous code.

Example code:

javascript
function fetchData() { return new Promise(resolve => resolve("data")); } // Translated: test('Asynchronous Test Example with Promise', () => { return fetchData().then(data => { expect(data).toBe("data"); }); });

In this example, fetchData returns a Promise that resolves to "data", and Jest waits for this Promise to resolve before executing the assertion.

3. Using Async/Await

Async/await is a modern and clear approach for handling asynchronous JavaScript code. Prefix your test function with the async keyword and use await when calling functions that return a Promise.

Example code:

javascript
async function fetchData() { return "data"; } // Translated: test('Asynchronous Test Example with async/await', async () => { const data = await fetchData(); expect(data).toBe("data"); });

In this example, await fetchData() ensures Jest waits for the Promise from fetchData to resolve, and then executes the assertion.

Summary

The choice of method depends on your specific requirements and coding style. If your asynchronous logic uses callback, the done method may be a good choice; if your codebase extensively uses Promise or async/await, the latter two methods may be more suitable. Using these methods ensures that all asynchronous code has completed correctly before executing assertions.

2024年6月29日 12:07 回复

你的答案