Ida*_*idi 7 javascript testing jestjs
我需要在 Jest 中的多个测试套件之间共享一个对象(数据库连接池)。
我已经读过globalSetup并且它似乎是初始化这个对象的正确位置,但是我怎样才能将该对象从globalSetup上下文传递到每个测试套件上下文?
我正在处理一个非常类似的问题,尽管在我的情况下,我试图共享一个数据库容器(我正在使用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