如何在Jest中更改模拟依赖项中方法的返回值



我正在写一个测试,看起来像这样:

import { getAllUsers } from "./users";
import { getMockReq, getMockRes } from "@jest-mock/express";
import User from "../../models/User";
jest.mock("../../models/User", () => ({
find: jest.fn(), // I want to change the return value of this mock in each test.
}));
describe("getAllUsers", () => {
test("makes request to database", async () => {
const req = getMockReq();
const { res, next, clearMockRes } = getMockRes();
await getAllUsers(req, res, next);
expect(User.find).toHaveBeenCalledTimes(1);
expect(User.find).toHaveBeenCalledWith();
});
});

在jest.mock语句中,我正在创建一个导入的"User"依赖项的mock,专门用于User.find((方法。我想做的是在我编写的每个测试中设置User.find((方法的返回值。这可能吗?

这个SO问题类似,但我的问题是我不能单独导入"find"方法,它只打包在User依赖项中。

经过多次尝试和错误,这里有一个有效的解决方案:

import { getAllUsers } from "./users";
import { getMockReq, getMockRes } from "@jest-mock/express";
import User from "../../models/User";
const UserFindMock = jest.spyOn(User, "find");
const UserFind = jest.fn();
UserFindMock.mockImplementation(UserFind);
describe("getAllUsers", () => {
test("makes request to database", async () => {
UserFind.mockReturnValue(["buster"]);
const req = getMockReq();
const { res, next, clearMockRes } = getMockRes();
await getAllUsers(req, res, next);
expect(User.find).toHaveBeenCalledTimes(1);
expect(User.find).toHaveBeenCalledWith();
expect(res.send).toHaveBeenCalledWith(["buster"]);
});
});

请注意,我是如何使用jest.spyOn在特定的User find方法上设置一个jest.fn((的,并且我可以使用UserFind变量来设置mock实现的返回值。

最新更新