让 Jest 全局设置和全局拆卸在打字稿项目中工作
Posted
技术标签:
【中文标题】让 Jest 全局设置和全局拆卸在打字稿项目中工作【英文标题】:Getting Jest global setup and global teardown to work in a typescript project 【发布时间】:2021-02-07 00:43:14 【问题描述】:我想运行一个在运行测试之前打开数据库连接的函数(全局设置)和另一个在运行测试后关闭数据库连接的函数(全局拆除)。目前我有以下配置:
package.json:
//...
"jest":
"testEnvironment": "node",
"globalSetup": "./src/jest/globalSetUp.ts",
"globalTeardown": "./src/jest/globalTearDown.ts",
"moduleFileExtensions": [
"js",
"ts"
],
"transform":
"\\.(ts|tsx)$": "ts-jest"
还有我的 globalSetUp.ts:
import initDB from "../dbUtils"
module.exports = async () =>
await initDB();
globalTearDown.ts:
import closeDB from "../dbUtils"
module.exports = async () =>
await closeDB();
但是当我运行我的测试时,我得到了 2 个主要错误。
Determining test suites to run.../home/me/Projects/.../Table1.ts:1
import Entity, PrimaryGeneratedColumn, Column, OneToMany, Index, PrimaryColumn, ColumnType, ColumnOptions from "typeorm";
^^^^^^
SyntaxError: Cannot use import statement outside a module
和
CannotExecuteNotConnectedError:无法在“默认”上执行操作 连接,因为连接尚未建立。
这意味着全局设置函数没有运行。注意我使用的是 typeORM。
我该如何正确设置才能正常工作?
编辑: 我的 initDB 函数:
export async function initDB()
console.log("inside intiDB");
await createConnection().then(async connection =>
console.log("connected to db");
).catch(error => console.log(error));
当我运行测试时,我看到inside initDB
,但我没有看到connected to db
。我认为 createConnection() 会查看我的实体目录,当它遇到 Table1.ts 时问题就出现了。然后它抱怨
import Entity, PrimaryGeneratedColumn, Column, OneToMany, Index, PrimaryColumn, ColumnType, ColumnOptions 来自“typeorm”; ^^^^^^
SyntaxError: Cannot use import statement outside a module
如果我删除 globalSetup 和 globalTearDown 而只是在我的测试文件中使用 beforeAll 和 afterAll 则一切正常。
【问题讨论】:
您能描述一下您用来运行测试的命令吗? 【参考方案1】:尝试在您的拆卸和设置文件中使用require
语句而不是import
语句,如下所示:
//globalTearDown.ts
const initDB = require("../dbUtils"); //<--- use require instead of import
module.exports = async () =>
await initDB();
对您的拆解文件执行相同操作。
【讨论】:
这并没有解决问题。我将 console.logs 放在 globalTearDown.ts 中,它确实打印了一些东西,因此文件可以正常运行。编辑了我的帖子【参考方案2】:globalSetup 和 globalTeardown 运行时,typescript 环境尚未定义,这就是 jest 失败的原因。
一种解决方法是通过在这些文件中要求 ts-node 来手动创建环境。
这是一个例子:
require('ts-node/register');
const setup = (): void =>
// whatever you need to set up globally
;
export default setup;
【讨论】:
所以我在 globalSetup.ts 和 globalTeardown.ts 中都添加了require('ts-node/register');
。但是当我尝试运行它时,我现在得到TSError: src/jest/globalTearDown.ts:26:111 - error TS2322: Type 'number' is not assignable to type ' label: number; sent: () => any; trys: any[]; ops: any[]; '. 26 if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) _ = 0; continue;
所以我猜 TS 现在可以正常工作了,你有一个打字错误。不过,如果不查看整个文件就很难调试。
它所指的代码不是我的。我的文件甚至不到 26 行。
尝试像这样运行你的函数:const setup = (): void => require('../dbUtils').initDB(); ;
@LTM 我相信你可以做到require("ts-node").register(transpileOnly: true)
。以上是关于让 Jest 全局设置和全局拆卸在打字稿项目中工作的主要内容,如果未能解决你的问题,请参考以下文章