typescript 使用.ts文件配置Jest全局测试设置

xcitsw88  于 2022-12-19  发布在  TypeScript
关注(0)|答案(4)|浏览(195)

我正在使用ts-jest(Jest和TypeScript),并希望为所有测试套件配置一些全局设置(初始化测试数据库)。
我发现在jest配置中有globalSetup选项:

"jest": {
    "globalSetup": "./jest-config.js"
}

但只有.js文件可以用于安装。我想使用.ts文件,因为我所有的代码包括在TypeScript安装代码。
我怎样才能做到这一点?

sirbozc5

sirbozc51#

我找到了解决办法。
我最初的项目结构是:

.
|--src
|  |--service.ts
|--tests
|  |--service.test.ts
|--dist
|--tsconfig.json 
|--package.json

.json包中的Jest配置:

"jest": {
  "globals": {
    "ts-jest": {
      "tsconfig": "tsconfig.json"
    }
  },
  "moduleFileExtensions": ["ts","js"],
  "transform": {
    "^.+\\.(ts|tsx)$": "./node_modules/ts-jest/preprocessor.js"
  },
  "testMatch": [
    "**/tests/**/*.test.(ts|js)"
  ],
  "testEnvironment": "node"
}

使用此配置,ts-jest在内存中执行.ts文件的transpiling。我在tsconfig.jsoncompilerOptions中有outDir选项,但在outDir中没有写入任何内容,因为我无法使用transpiled jest-config.js

然后移动src中的tests文件夹并更改Jest配置。项目的新结构为:

.
|--src
|  |--service.ts
|  |--tests
|     |--service.test.ts
|     |--jest-config.ts
|--dist
|--tsconfig.json 
|--package.json

新的Jest配置为:

"jest": {
  "globalSetup": "./dist/tests/jest-config.js",
  "moduleFileExtensions": ["ts", "js", "json"],
  "testMatch": [
    "**/dist/**/*.test.js"
  ],
  "testEnvironment": "node"
}

现在我可以在Jest中使用jest-config.js进行全局设置。
添加

  • Jest安装文件(在我的示例jest-config.js中)必须导出一个异步函数:

module.exports = async function() { ... }

  • 在运行测试之前,您需要编译源.ts文件。
vxqlmq5t

vxqlmq5t2#

全局设置是在ts环境可用之前执行的,因此解决方法是手动创建环境,要求在文件开头输入 ts-node
在您的jest配置(package.jsonjest.config.js)中:

"globalSetup": "./globalSetup.ts"

然后在globalSetup.ts中:

require('ts-node/register');

const setup = (): void => {
  // whatever you need to setup globally
};

export default setup;

您可以在github上阅读更多关于 ts-node 的信息。

ej83mcc0

ej83mcc03#

对于有@remeus答案的TS错误的任何人,以下更改将起到作用:

require('ts-node').register({
  transpileOnly: true,
});

如果使用绝对导入,请使用以下命令:

require('tsconfig-paths').register();
shyt4zoc

shyt4zoc4#

@glinda93回答帮助了我,但我在globalTeardown文件中得到了一个错误。
解决方案是在globalSetup文件中添加require('tsconfig-paths').register();,然后:

require('ts-node').register({
  transpileOnly: true,
});

require('tsconfig-paths').register();

在全局拆卸文件中。
由于某种原因,如果TS节点寄存器仅在拆卸文件中,则它工作。

相关问题