Vitest picks up the files in __mocks__ on its own when you call vi.mock(). Importing one by its path doesn't mock anything. The code under test still gets the real module, and your assertions look at a mock that nobody calls.
Import the real path and mock it. The test and the code under test then share the same mock.
Configure
Off by default. To turn it on:
bunfig.toml
[lint.rules]
"vitest/no-mocks-import" = "error" # or "warn"
Examples
Reported:
import { expect, test } from "vitest";
import { sendEmail } from "./__mocks__/mailer";
import { register } from "./register";
test("sends a welcome email", () => {
register("ada@example.com");
expect(sendEmail).toHaveBeenCalled();
});
require() is checked too:
const { sendEmail } = require("../__mocks__/mailer");
Not reported:
import { expect, test, vi } from "vitest";
import { sendEmail } from "./mailer";
import { register } from "./register";
vi.mock("./mailer");
test("sends a welcome email", () => {
register("ada@example.com");
expect(sendEmail).toHaveBeenCalled();
});