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
相关产品推荐
相关产品推荐

