typescript 正在jest中获取未定义的postgres导入

cnh2zyt3  于 2023-01-10  发布在  TypeScript
关注(0)|答案(1)|浏览(120)

我有一个使用pghttps://www.npmjs.com/package/pg)的应用程序,它这样做没有问题,但是现在我开始用jest为它编写测试,我在导入pg时遇到了问题。
这是我运行测试时jest说的

TypeError: Cannot destructure property 'Client' of '_pg.default' as it is undefined.

      1 | import pg from "pg";
      2 | console.log("pg:" + pg);
    > 3 | const { Client } = pg;

并且控制台输出同意它是未定义的。
奇怪的是,当应用程序使用它时,它不是问题。
所以不确定它是否与jests babel配置有关?

//babel.config.js
module.exports = {
  presets: [
    ["@babel/preset-env", { targets: { node: "current" } }],
    "@babel/preset-typescript",
  ],
  plugins: [
    "babel-plugin-transform-typescript-metadata",
    ["@babel/plugin-proposal-decorators", { legacy: true }],
    ["@babel/plugin-proposal-class-properties", { loose: false }],
  ],
};

可能是它和tsconfig不匹配

tsconfig.json
{
  "compilerOptions": {
    "experimentalDecorators": true,
    "emitDecoratorMetadata": true,
    "module": "commonjs",
    "esModuleInterop": true,
    "target": "es6",
    "moduleResolution": "node",
    "sourceMap": true,
    "outDir": "dist",
    "baseUrl": ".",
    "paths": {
      "*": ["node_modules/*"]
    }
  },
  "include": ["src/**/*"]
}

我尝试删除Babel,并使用此配置安装了ts-jest

//jest.config.js
/** @type {import('ts-jest/dist/types').InitialOptionsTsJest} */
module.exports = {
  preset: "ts-jest",
  testEnvironment: "node",
  globals: {
    "ts-jest": {
      tsconfig: "tsconfig.json",
    },
  },
};

我得到了完全相同的错误,所以可能与巴别塔无关,但我不明白测试和“非测试”之间如何/为什么会有差异。
而且我正在做与pg的文档相同的事情(据我所知)
https://node-postgres.com/
这是我的测试文件和pg文件。我删除了所有失败的地方(为了不发布太多行)。

//word/word.test.ts
import "reflect-metadata";
import { defineFeature, loadFeature } from "jest-cucumber";
import * as pg from "../pg";
...
//pg.ts
// import pg from "pg";
// console.log("pg:" + pg);
// const { Client } = pg;
// import { Client } from "pg";
const { Client } = require("pg");
console.log(Client);
if (!Client) process.exit(1);
// import pkg from "pg";
// const Client = pkg.Client;
//new error:
> jest --forceExit

  console.log
    undefined

      at Object.<anonymous> (src/pg.ts:6:9)

  ●  process.exit called with "1"

       5 | const { Client } = require("pg");
       6 | console.log(Client);
    >  7 | if (!Client) process.exit(1);
         |                      ^
       8 | // import pkg from "pg";
       9 | // const Client = pkg.Client;
      10 |

      at Object.<anonymous> (src/pg.ts:7:22)
      at Object.<anonymous> (src/word/word.test.ts:3:1)

pg文件是一个烂摊子与不同的方式导入pg和没有组合似乎已经为我工作

n6lpvg4x

n6lpvg4x1#

我在@google-cloud/logging-winston中遇到了类似的错误(并且没有使用TS):
TypeError: Cannot destructure property 'LoggingWinston' of '_loggingWinston.default' as it is undefined.
我不太明白为什么库导入是未定义的,因为正如您提到的,当运行代码时,它执行得很好。
相反,作为一种变通方法,我manually mocked模块,它为我解决了这个问题。
希望能帮上忙。

  • [编辑] 2013年1月9日*

所以当我扩展我的测试覆盖范围时,我在其他导入中不断遇到这个问题,显然像上面那样模拟每个模块是完全不切实际的。所以经过进一步的挖掘,发现问题的根源在于这些模块没有默认的导出,一个简单的解决方法是更新导入语句:
发件人:

import dateFns from 'date-fns'
const { format } = dateFns

收件人:

import * as dateFns from 'date-fns'
const { format } = dateFns

相关问题