如何使用 Typescript 创建 Jest 自定义环境?

Gol*_*lsh 7 javascript automated-tests typescript jestjs

我正在尝试创建一个扩展jest-node-environmentCustomTestEnvironment但是在尝试运行 jest 时出现以下错误

? Test suite failed to run

    ~/git/my-application/tests/environment/custom-test-environment.ts:1
    import NodeEnvironment from 'jest-environment-node';
    ^^^^^^

    SyntaxError: Cannot use import statement outside a module

      at runTestInternal (../node_modules/jest-runner/build/runTest.js:226:5)
Run Code Online (Sandbox Code Playgroud)

我相信这个错误意味着它没有将其识别为打字稿文件,并且没有对其进行转译。(我使用的是最新版本的 jest 26.0.1)

根据 jest github 中的讨论,完成这项工作的 PR 原定用于 Jest 26,但已从 Jest 26 中撤出,并且(希望)将出现在 Jest 27 中 。https://github.com/facebook/jest/pull /8751

话虽如此,我已经在网上看到人们这样做的样本,但对我来说,跟随他们的领导并没有任何运气。

import NodeEnvironment from "jest-environment-node";
import {LocalObject} from "./object/local-object.helper";

export class CustomTestEnvironment extends NodeEnvironment {

    public async setup(): Promise<void> {
        await super.setup();
        this.global.localObject = LocalObject.init()
    }

    public async teardown(): Promise<void> {
        LocalObject.teardown(this.global.localObject)
        await super.teardown();
    }
}
Run Code Online (Sandbox Code Playgroud)

LocalObject 只是一个围绕测试实用程序的薄包装器,它具有复杂的启动和拆卸,我想将其提供给测试,以便能够发布测试数据并启动组件测试。

如果我将导入更改为需要 -

const NodeEnvironment = require("jest-environment-node");
const {LocalObject} =  require("./object/local-object.helper");
Run Code Online (Sandbox Code Playgroud)

然后我得到这个错误 -

SyntaxError: Unexpected token 'export'
Run Code Online (Sandbox Code Playgroud)

如果我将导出移动到一个module.exports然后我收到以下错误

public async setup(): Promise<void> {
       ^^^^^              

SyntaxError: Unexpected token 'async'
Run Code Online (Sandbox Code Playgroud)

在我看来,它没有将此文件视为打字稿。

是否有任何解决方法可以将其用作打字稿文件?这LocalObject是用打字稿写的,所以我相信我需要这个打字稿才能与那个打字稿一起工作,重要的是LocalObject文件保持打字稿以便测试文件正确使用它。

替代问题:我可以在setupFilesAfterEnv我只看到它们在测试之前而不是在测试之后运行时执行相同类型的设置/拆卸逻辑吗?谢谢。

Gol*_*lsh 3

更新:Jest 27 现已发布并支持此功能。如果您使用旧版本的 Jest,请更新到 Jest 27,以便能够使用 CustomEnvironment 作为打字稿https://jestjs.io/blog/2021/05/25/jest-27#features-coming-with-breaking-变化

以下配置选项中使用的模块现在像代码的其余部分一样进行转换,如果您依赖它们按原样加载,则可能会破坏它们:

  • 测试环境
  • 跑步者
  • 测试运行者
  • 快照解析器

或者,您可以继续对早期版本使用以下解决方法。


Jest 26 不支持此功能,预计 Jest 27 中支持此功能https://github.com/facebook/jest/pull/8751#issuecomment-699049851

目前的解决方案是使用我的 jest.config https://jestjs.io/docs/en/configuration#setupfilesafterenv-arraysetupFilesAfterEnv中的文件。

从那里我可以将我所有的设置/拆卸放入beforeAll()afterAll()块中。这实际上相当于使用节点环境,并且setupFilesAfterEnv文件与打字稿兼容。

//jest.setup.ts
import {LocalObject} from "./object/local-object.helper";

let localObject: LocalObject;

beforeAll(async () => {
  //Start my environment or seed data to DB or whatever
  localObject = await LocalObject.init()
}


afterAll(async () => {
  //teardown or clean things started in setup my environment
  await localObject.teardown()
}
Run Code Online (Sandbox Code Playgroud)

  • 这似乎对我不起作用。`beforeAll` 在我的所有测试运行后运行。 (2认同)