首页 > 解决方案 > 如何在 Jest 中的多个测试套件之间共享一个对象?

问题描述

我需要在 Jest 中的多个测试套件之间共享一个对象(数据库连接池)。
我已经阅读过globalSetup它似乎是初始化这个对象的正确位置,但是如何将该对象从globalSetup上下文传递到每个测试套件上下文?

标签: javascripttestingjestjs

解决方案


我正在处理一个非常相似的问题,尽管在我的情况下,我试图共享一个数据库容器(我正在使用dockerode),我在所有测试之前启动一次并在之后删除以节省旋转容器的开销每间套房。

对我们来说不幸的是,在查看了大量文档和Github 问题后,我的结论是这是设计使然,因为 Jest 的理念是在沙盒中运行测试并且在这种限制下,我完全明白他们为什么选择不支持这一点。

具体来说,对于我的用例,我最终在globalSetup脚本中旋转了一个容器,用当前测试运行的一些唯一标识符(比如时间戳)标记它,并在最后用 a 删除它globalTeardown(因为全局步骤可以在他们)。

这看起来大致如下:

const options: ContainerCreateOptions = {
Image: POSTGRES_IMAGE,
Tty: false,
HostConfig: {
    AutoRemove: true,
    PortBindings: {'5432/tcp': [{HostPort: `${randomPort}/tcp`}]}
},
Env: [`POSTGRES_DB=${this.env['DB_NAME']}`,
    `POSTGRES_USER=${this.env['DB_USERNAME']}`,
    `POSTGRES_PASSWORD=${this.env['DB_PASSWORD']}`]
};
options.Labels = { testContainer: `${CURRENT_TEST_TIMESTAMP}`};
let container = await this.docker.createContainer(options);
await container.start();

this.env我的情况下是.env我根据测试预加载的文件。

为了为我的测试获取容器端口/ip(或我感兴趣的任何其他内容),我使用了一个自定义环境,我的 DB 要求测试使用该环境来公开global变量的相关信息(提醒:你只能放置原语和对象在全局上,而不是实例上)。

在您的情况下,在套件之间传递连接池的要求可能只是不适合开玩笑,因为它永远不会让您在不同套件之间传递实例(至少这是我基于我共享的所有链接的理解)。但是,您可以尝试以下任一方法:

  • 将需要相同连接池的所有测试放入单个套件/文件中(不是很好,但会满足您的需求)
  • 做一些类似于我建议的事情(在全局中设置一次数据库,在自定义环境中构建连接池,然后至少每个套件都有自己的池),这样你就有很多代码重用用于设置,这很好。这里讨论了类似的事情。

Miscalenous:我偶然发现了testdeck,它也可以满足您的需求(使用您的连接池设置一个抽象测试类并在所有必需的测试中继承它) - 我没有尝试过,所以我不知道它在 Jest 中的表现如何,但是当我用 Java 编写时,这就是我们用来实现类似功能的方式TestNG


推荐阅读