使用 Jest 测试 NestJS + TypeORM 时“‘instanceof’的右侧不是对象”

Jav*_*ome 7 jestjs typeorm nestjs ts-jest

我有一个正在运行的 NestJS 服务器,它执行一些 TypeORMrepository.insert()命令。然而,当从 Jest 测试运行相同的操作时(使用@nestjs/testing's )Test.createTestingModule(...),会出现臭名昭著的Right-hand side of 'instanceof' is not an object情况。

查看更多详细信息,这似乎是由于 TypeORM 中发生的一些动态加载造成的QueryBuilder

// loading it dynamically because of circular issue
const InsertQueryBuilderCls = require("./InsertQueryBuilder").InsertQueryBuilder;
Run Code Online (Sandbox Code Playgroud)

该行在运行 NestJS 服务器时成功,但在运行 Jest 测试时失败。进一步来说:

  • 在 NestJS 服务器中:QueryBuilderrequire("./InsertQueryBuilder")返回一个包含 a 的 ES 模块InsertQueryBuilder。在这里设置断点时,奇怪的是,调试文件出现位于src/query-builder/QueryBuilder.ts(它不存在,应该是node_modules/typeorm/query-builder/QueryBuilder.js),但是成功了。
  • 在 Jest 测试中:require("./InsertQueryBuilder")返回一个空对象,因此它实际上InsertQueryBuilder不是undefined一个对象。调试后的文件符合预期node_modules/typeorm/query-builder/QueryBuilder.js,但失败了。

我看起来这可能与我的 Jest 配置有关,即:

module.exports = {
  preset: 'ts-jest',
  testEnvironment: 'node',
  moduleDirectories: ['node_modules', 'src']
}
Run Code Online (Sandbox Code Playgroud)

因为我的 Typescript 源位于src项目根目录下的目录下。这些路径问题也与 my 相关tsconfig.json,其中包含:

{
  "compilerOptions": {
  "module": "commonjs",
  "allowSyntheticDefaultImports": true,
  "target": "es2019",
  "baseUrl": "./src",
  "outDir": "./dist",
  "incremental": true,
  "lib": [
    "es2019"
  ]
}
Run Code Online (Sandbox Code Playgroud)