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

Posted

技术标签:

【中文标题】如何在 Jest 的模拟依赖项中更改方法的返回值?【英文标题】:How to change the return value of a method within a mocked dependency in Jest? 【发布时间】:2022-01-14 00:41:01 【问题描述】:

我正在编写一个如下所示的测试:

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.find() 方法。我想做的是在我编写的每个测试中设置 User.find() 方法的返回值。这可能吗?

This SO question is similar,但我的问题是我无法单独导入“查找”方法,它只能打包在用户依赖项中。

【问题讨论】:

【参考方案1】:

经过多次尝试和错误,这是一个可行的解决方案:

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 变量来设置模拟实现的返回值。

【讨论】:

以上是关于如何在 Jest 的模拟依赖项中更改方法的返回值?的主要内容,如果未能解决你的问题,请参考以下文章

热门模拟具有不同类型返回值的函数?

在 Jest 中,如何模拟具有依赖项的 TypeScript 类?

如何使用 jest.mock 模拟 useRef 和反应测试库

Typescript Jest 说我想模拟的类型上不存在模拟或模拟返回值

用 Jest 模拟 Firebase 功能(单元测试)

NextJS Router & Jest:如何模拟路由器更改事件