如何在 Jest 中的多个测试套件之间共享一个对象?

Ida*_*idi 7 javascript testing jestjs

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

dan*_*anf 6

我正在处理一个非常类似的问题,尽管在我的情况下,我试图共享一个数据库容器(我正在使用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();
Run Code Online (Sandbox Code Playgroud)

在我的例子中,this.env.env我根据测试预加载的文件。

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

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

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

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


小智 0

在每个测试文件中,您可以定义一个函数来加载必要的数据或模拟数据。为此,请使用 beforeEach() 函数。文档示例在这里!

  • 我需要为每个 *所有* 测试套件初始化一个对象(正如我所说 - 这是集成测试环境,我需要加载 Express 应用程序并初始化数据库连接池),因此称为“beforeEach()”在每个测试之前,因此在每个测试套件之前调用的“beforeAll()”不适合这种需要 (5认同)