【问题标题】:Getting Jest global setup and global teardown to work in a typescript project让 Jest 全局设置和全局拆卸在打字稿项目中工作
【发布时间】: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 则一切正常。

【问题讨论】:

  • 您能描述一下您用来运行测试的命令吗?

标签: node.js typescript npm jestjs typeorm


【解决方案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})
猜你喜欢
  • 2020-11-18
  • 2014-11-27
  • 1970-01-01
  • 1970-01-01
  • 2021-09-17
  • 2012-11-28
  • 2017-08-16
  • 1970-01-01
  • 2020-10-27
相关资源
最近更新 更多