让 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】:

globalSetupglobalTeardown 运行时,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: () =&gt; any; trys: any[]; ops: any[]; '. 26 if (!(t = _.trys, t = t.length &gt; 0 &amp;&amp; t[t.length - 1]) &amp;&amp; (op[0] === 6 || op[0] === 2)) _ = 0; continue; 所以我猜 TS 现在可以正常工作了,你有一个打字错误。不过,如果不查看整个文件就很难调试。 它所指的代码不是我的。我的文件甚至不到 26 行。 尝试像这样运行你的函数:const setup = (): void =&gt; require('../dbUtils').initDB(); ; @LTM 我相信你可以做到require("ts-node").register(transpileOnly: true)

以上是关于让 Jest 全局设置和全局拆卸在打字稿项目中工作的主要内容,如果未能解决你的问题,请参考以下文章

如何让打字稿方法回调在 VueJs 中工作?

打字稿:如何在全局范围内进行一些导入?

如何在打字稿中声明全局变量

打字稿中的全局类型

打字稿允许变量污染全局范围

带有打字稿的角度材料设计