Skip to content
ReinerLau edited this page May 24, 2024 · 1 revision

作用

如果函数依赖外部模块,直接测试就会变成集成测试,但我们不关心函数以外的逻辑,因此需要模拟外部模块的数据

准备测试

UserStore.js

class User {
  getUser() {
    // logic to get data from a database
  }
  setUser() {
    // logic to store data in a database
  }
}
let UserStore = new User();

module.exports = { UserStore };

name.js

const { UserStore } = require("./UserStore");

function getUserDisplayName() {
  const user = UserStore.getUser();
  return `${user.LastName}, ${user.FirstName}`;
}

module.exports = getUserDisplayName;

name.test.js

const getUserDisplayName = require("./name");

test("Returns display name", () => {
  expect(getUserDisplayName(1)).toBe("Polesny, Ondrej");
});

直接运行测试毫无疑问会失败,因此需要模拟一下模块的实现

Mock

name.test.js

jest.mock("./UserStore", () => ({
  UserStore: {
    getUser: jest.fn().mockImplementation((arg) => ({
      FirstName: "Ondrej",
      LastName: "Polesny",
    })),
    setUser: jest.fn(),
  },
}));

如果不关心函数的实现,直接使用 jest.fn 就可以

Clone this wiki locally