gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 19:53:54 31 4
gpt4 key购买 nike

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

最佳答案

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

不幸的是,在查阅了很多文档和Github之后issues我的结论是这是by design因为 Jest 的理念是 run tests sandboxed在这种限制下,我完全明白为什么他们 choose不支持这个。

具体来说,对于我的用例,我最终在 globalSetup 脚本中旋转了一个容器,用当前测试运行的一些唯一标识符(比如时间戳)标记它,并在最后删除它一个 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(或我感兴趣的任何其他内容)用于我的测试,我使用 custom envrironment我的 DB-required 测试用于公开有关 global 变量的相关信息(提醒:您只能将原语和对象放在全局,而不是实例)。

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

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

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

实现类似功能的方式

关于javascript - 如何在 Jest 中的多个测试套件之间共享一个对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54654040/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com