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

Jest从27.0.6升级到29.7.0后单元测试报错:TypeError: Cannot read properties of undefined (reading '_setAdapter')

Jest从27.0.6升级到29.7.0后单元测试报错:TypeError: Cannot read properties of undefined (reading '_setAdapter')

嘿,我刚帮你捋清楚这个问题的来龙去脉了,其实根源出在你导入mock-knex的方式上——升级Jest/Node后环境更严格,把之前隐藏的上下文绑定问题给暴露出来了。

先给你拆解下报错原因:你贴的mock-knex源码里,mock是一个类的实例方法,正常调用时this应该指向mock-knex模块导出的实例对象。但你用了解构导入{ mock as mockKnex },把这个方法单独抽出来调用时,它失去了原本的this上下文,在严格模式下this直接变成了undefined,自然就找不到_setAdapter方法了。

至于你问是Jest还是Node的问题?其实都不是,这是模块导入方式导致的函数绑定丢失,升级后的版本只是不再容忍这种不规范的调用方式而已。

下面给你两个解决方案,优先推荐第一个:

方案1:改用默认导入mock-knex模块

直接导入整个mock-knex模块,调用模块上的mock方法,这样this会自动绑定到正确的实例上:

import mockKnex from "mock-knex";
import { postgresConnectionPool } from "../../src/database/PostgresConnectionPool";

mockKnex.mock(postgresConnectionPool); // 现在不会报错了

describe("Test Suites", () => {
  // test cases
})

方案2:手动绑定this上下文

如果不想改导入方式,也可以手动把mock方法绑定到mock-knex的实例上:

import { mock as rawMockKnex, getTracker } from "mock-knex";
import mockKnexModule from "mock-knex";

// 手动绑定this到模块实例
const mockKnex = rawMockKnex.bind(mockKnexModule);
mockKnex(postgresConnectionPool);

describe("Test Suites", () => {
  // test cases
})

另外建议你同步升级mock-knex到最新版本,确保它和你当前的Jest 29.x、Node版本兼容,避免其他潜在的适配问题。

备注:内容来源于stack exchange,提问作者africandrogba

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 10:32:58