Linter · Rules
jest/valid-expect-in-promise
Require a promise chain that contains expect to be awaited or returned from the test
A callback passed to .then(), .catch() or .finally() runs later. If the test doesn't await or return the promise, Jest marks the test as passed before the expect in the callback runs, and a failed assertion doesn't fail the test.
Configure
Off by default. To turn it on:
bunfig.toml
[lint.rules]
"jest/valid-expect-in-promise" = "error" # or "warn"
Examples
Reported:
import { expect, test } from "@jest/globals";
test("loads the user", () => {
loadUser(1).then((user) => {
expect(user.name).toBe("Ada");
});
});
You also need to await or return a promise that's kept in a variable:
import { expect, test } from "@jest/globals";
test("loads the user", () => {
const check = loadUser(1).then((user) => {
expect(user.name).toBe("Ada");
});
});
Code after the test's return never runs:
import { expect, test } from "@jest/globals";
test("loads both users", () => {
return loadUser(1).then((user) => {
expect(user.name).toBe("Ada");
});
loadUser(2).then((user) => {
expect(user.name).toBe("Grace");
});
});
Not reported:
import { expect, test } from "@jest/globals";
test("loads the user", () => {
return loadUser(1).then((user) => {
expect(user.name).toBe("Ada");
});
});
test("loads the admin", async () => {
await loadUser(2).then((user) => {
expect(user.role).toBe("admin");
});
});
test("loads the guest", async () => {
const user = await loadUser(3);
expect(user.role).toBe("guest");
});
You can await several promises together:
import { expect, test } from "@jest/globals";
test("loads both users", async () => {
const first = loadUser(1).then((user) => {
expect(user.name).toBe("Ada");
});
const second = loadUser(2).then((user) => {
expect(user.name).toBe("Grace");
});
await Promise.all([first, second]);
});
A test with a parameter isn't checked, because calling done is another way to make Jest wait:
import { expect, test } from "@jest/globals";
test("loads the user", (done) => {
loadUser(1).then((user) => {
expect(user.name).toBe("Ada");
done();
});
});