我有一个使用pg
(https://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
和没有组合似乎已经为我工作
1条答案
按热度按时间n6lpvg4x1#
我在
@google-cloud/logging-winston
中遇到了类似的错误(并且没有使用TS):TypeError: Cannot destructure property 'LoggingWinston' of '_loggingWinston.default' as it is undefined.
我不太明白为什么库导入是未定义的,因为正如您提到的,当运行代码时,它执行得很好。
相反,作为一种变通方法,我manually mocked模块,它为我解决了这个问题。
希望能帮上忙。
所以当我扩展我的测试覆盖范围时,我在其他导入中不断遇到这个问题,显然像上面那样模拟每个模块是完全不切实际的。所以经过进一步的挖掘,发现问题的根源在于这些模块没有默认的导出,一个简单的解决方法是更新导入语句:
发件人:
收件人: