【问题标题】:How to create Jest Custom Environment with Typescript?如何使用 Typescript 创建 Jest 自定义环境?
【发布时间】:2020-09-10 10:01:13
【问题描述】:

我正在尝试将 jest-node-environment 的扩展名创建为 CustomTestEnvironment,但在尝试运行 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)

我相信这个错误意味着它没有将其识别为打字稿文件,并且没有对其进行转译。 (我用的是最新版的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();
    }
}

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

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

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

然后我得到了这个错误 -

SyntaxError: Unexpected token 'export'

如果我将导出内容移到 module.exports 中,则会出现以下错误

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

SyntaxError: Unexpected token 'async'

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

是否有任何解决方法可以将其用作打字稿文件? LocalObject 是用 typescript 编写的,所以我相信我需要将它作为 typescript 才能正确使用它,重要的是 LocalObject 文件仍然是 typescript 以便测试文件正确使用它。

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

【问题讨论】:

  • 您解决了这个问题了吗?我现在遇到了同样的问题。
  • 不,我必须改用setupFilesAfterEnv。 (见答案)

标签: javascript typescript jestjs automated-tests


【解决方案1】:

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

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

  • 测试环境
  • 跑步者
  • testRunner
  • snapshotResolver

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


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

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

从那里我可以将我所有的设置/拆卸放在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()
}

【讨论】:

  • 这似乎对我不起作用。 beforeAll 在我的所有测试都运行后运行。
  • 嗯,奇怪。我没有看到任何代码的第一个猜测是检查您是否在任何异步方法上缺少await?如果您不使用异步,则可以将异步放在 beforeAll 上,例如 beforeAll(() =&gt; { @rikkit
  • 谢谢!我第一次使用globalSetup,但这不允许与测试共享状态。然后setupFiles 但看不到如何等待承诺。在setupFilesAfterEnv 中使用beforeAll 终于做了我需要的!
猜你喜欢
  • 2020-01-29
  • 2023-02-19
  • 1970-01-01
  • 2021-04-28
  • 1970-01-01
  • 2020-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多