You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用jest.mock模拟MySQLReplica时报Cannot find module错误如何解决?

问题解决方案

错误原因

你代码中的jest.mock("MySQLReplica")写法不符合Jest的模拟规则:jest.mock()的第一个参数要求传入需要模拟的模块路径/模块名,而你传入的是从模块中导出的变量名MySQLReplica,Jest会将其视为独立的npm包或文件去查找,自然找不到对应模块,触发报错。

解决方法

你可以直接模拟自己封装的@services/mysql.service模块,修改测试代码即可:

  1. 将jest.mock("MySQLReplica")替换为jest.mock("@services/mysql.service"),明确指定要模拟的是你自己写的mysql服务模块
  2. 按需给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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 06:06:03