使用jest.mock模拟MySQLReplica时报Cannot find module错误如何解决?
问题解决方案
错误原因
你代码中的jest.mock("MySQLReplica")写法不符合Jest的模拟规则:jest.mock()的第一个参数要求传入需要模拟的模块路径/模块名,而你传入的是从模块中导出的变量名MySQLReplica,Jest会将其视为独立的npm包或文件去查找,自然找不到对应模块,触发报错。
解决方法
你可以直接模拟自己封装的@services/mysql.service模块,修改测试代码即可:
- 将
jest.mock("MySQLReplica")替换为jest.mock("@services/mysql.service"),明确指定要模拟的是你自己写的mysql服务模块 - 按需给
MySQLReplica的方法添加模拟返回值,匹配你的业务逻辑
修改后的完整测试代码参考:
import { MySQLReplica } from "@services/mysql.service"; import { IEntityLeaderboardQuery } from "./../leaderboard.interface"; import { PopularityRank } from "./popularity"; import { mocked } from "ts-jest/utils"; // 修正:模拟整个mysql服务模块 jest.mock("@services/mysql.service"); describe("Leaderboard - Rank - Popularity", () => { afterAll(() => { MySQLReplica.end(); }); const mockedMySQLReplica = mocked(MySQLReplica, true); it("should get popularity scores", async () => { // 模拟query方法返回你需要的假数据,结构和mysql2真实返回一致即可 mockedMySQLReplica.query.mockResolvedValue([ [{ id: 1, popularity_score: 98, name: "测试条目" }], [] ]); const query: IEntityLeaderboardQuery = { top: "10", entity_types: ["person"], region: "Europe", country: "Germany", end_date: "2021-06-15", start_date: "2021-06-01", rank: "popularity", }; const result = await PopularityRank(query); // 替换为你实际的断言逻辑 expect(result).toHaveLength(1); }); });
注意事项
如果你使用的是较新版本的ts-jest,mocked工具已经迁移到jest-mock包中,若出现导入报错,可将导入语句替换为import { mocked } from "jest-mock";。
内容的提问来源于stack exchange,提问作者Kay
相关产品推荐
相关产品推荐

