jest.mock 找不到模块

Kay*_*Kay 12 node.js jestjs ts-jest

我有一个使用 mysql 连接进行查询的函数,我正在尝试对该函数进行单元测试,为此我需要模拟 mysql。但是,当我使用 jest.mock 函数来模拟 mysql 连接时,它返回以下错误。

无法从“src/api/leaderboard/ranks/popularity.test.ts”找到模块“MySQLReplica”

流行度.test.ts

import { MySQLReplica } from "@services/mysql.service";
import { IEntityLeaderboardQuery } from "./../leaderboard.interface";
import { PopularityRank } from "./popularity";
import { mocked } from "ts-jest/utils";
jest.mock("MySQLReplica");

describe("Leaderboard - Rank - Popularity", () => {
    afterAll(() => {
        MySQLReplica.end();
    });

    const mockedMySQLReplica = mocked(MySQLReplica, true);
    it("should get popularity scores", async () => {
        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);
        console.log(result);
    });
});
Run Code Online (Sandbox Code Playgroud)

服务/mysql.service.ts

import mysql from "mysql2/promise";
import { Config } from "@config";

export const MySQLReplica = mysql.createPool({
    host: Config.db.replica.host,
    database: Config.db.replica.database,
    user: Config.db.replica.username,
    password: Config.db.replica.password,
    waitForConnections: true,
    connectionLimit: 500,
    queueLimit: 0,
});

export const MySQLWrite = mysql.createPool({
    host: Config.db.write.host,
    database: Config.db.write.database,
    user: Config.db.write.username,
    password: Config.db.write.password,
    waitForConnections: true,
    connectionLimit: 100,
    queueLimit: 0,
});

export const MySQLPreparedStatement = mysql.format;
Run Code Online (Sandbox Code Playgroud)

Ian*_*Ian 12

moduleName中的参数是jest.mock()一个路径。

请参阅此处的官方文档

例如:

import moduleName, {foo} from '../moduleName';

jest.mock('../moduleName', () => {
  return {
    __esModule: true,
    default: jest.fn(() => 42),
    foo: jest.fn(() => 43),
  };
});

moduleName(); // Will return 42
foo(); // Will return 43
Run Code Online (Sandbox Code Playgroud)

所以在你的情况下它将是:

import { MySQLReplica } from "@services/mysql.service";

jest.mock("@services/mysql.service");
Run Code Online (Sandbox Code Playgroud)