Jest模拟@gmx-io/sdk模块函数时,调用mockReturnValue提示“不是函数”的问题求助
Jest模拟@gmx-io/sdk模块函数时,调用mockReturnValue提示“不是函数”的问题求助
大家好,我最近在尝试用Jest模拟@gmx-io/sdk模块里的函数时碰到了棘手的问题,折腾了好一阵没搞定,来求助各位大佬!
我的需求是模拟@gmx-io/sdk/utils/fees/priceImpact.js里的getPriceImpactForPosition,以及@gmx-io/sdk/utils/numbers.js里的getBasisPoints这两个函数。按照常规的Jest mock写法我这么试了:
import { getPriceImpactForPosition } from "@gmx-io/sdk/utils/fees/priceImpact.js"; import { getBasisPoints } from "@gmx-io/sdk/utils/numbers.js"; // 把mock声明放在所有import前面 jest.mock("@gmx-io/sdk/utils/fees/priceImpact.js", () => ({ getPriceImpactForPosition: jest.fn() })); jest.mock("@gmx-io/sdk/utils/numbers.js", () => ({ getBasisPoints: jest.fn() }));
但当我尝试调用getPriceImpactForPosition.mockReturnValue(xxx)或者getBasisPoints.mockReturnValue(xxx)的时候,控制台直接提示我这两个变量不是函数。我猜应该是mock根本没生效,代码还在调用原模块的真实实现。
下面是我的jest.config.js完整配置:
/** @type {import('ts-jest').JestConfigWithTsJest} **/ export default { preset: "ts-jest/presets/js-with-ts-esm", testEnvironment: "node", testPathIgnorePatterns: ["/node_modules/", "/dist/"], transformIgnorePatterns: ["node_modules/(?!(@gmx-io/sdk))"], extensionsToTreatAsEsm: [".ts", ".jsx"], transform: { "^.+\\.(ts|js|mjs)$": ["ts-jest", { useESM: true, tsconfig: "tsconfig.json", }], }, moduleNameMapper: { "^(\\.{1,2}/.*)\\.js$": "$1" } };
我还特意看了@gmx-io/sdk包的package.json里的exports配置,会不会是这个结构影响了Jest的mock识别?
"exports": { ".": { "import": "./build/src/index.js", "require": "./build/src/index.js" }, "./abis/*": "./build/abis/*", "./prebuilt/*": "./build/prebuilt/*", "./utils/*": "./build/src/utils/*", "./types/*": "./build/src/types/*", "./configs/*": "./build/src/configs/*" },
最后说下我运行测试的命令:
NODE_OPTIONS=--experimental-vm-modules jest --passWithNoTests
有没有大佬碰到过类似的情况?麻烦帮忙看看问题出在哪,怎么才能正确mock这两个函数呀?
备注:内容来源于stack exchange,提问作者DorkMonstuh
相关产品推荐
相关产品推荐

