我需要在Jest中的多个测试套件之间共享一个对象(数据库连接池)。
我已经读过有关globalSetup
的信息,它似乎是初始化该对象的正确位置,但是如何将那个对象从globalSetup
上下文传递到每个测试套件上下文?
答案 0 :(得分:2)
我正在处理一个非常类似的问题,尽管在我的情况下,我试图共享一个数据库容器(我使用dockerode),在所有测试之前我先旋转了一次,然后保存下来以保存为每个套件旋转容器的开销。
对于我们来说,很不幸,在查阅了许多文档和Github issues后,我的结论是by design是因为Jest的哲学是{{ 3}},在这个限制下,我完全理解为什么他们run tests sandboxed不支持这一点。
具体来说,对于我的用例,我最终在globalSetup
脚本中旋转了一个容器,用当前测试运行的唯一标识符(例如时间戳)对其进行标记,并在末尾使用{{ 1}}(之所以有效,是因为全局步骤可以在它们之间共享状态)。
这大致类似于:
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
文件。
要获得测试的容器端口/ ip(或我感兴趣的其他信息),我使用了choose,需要DB的测试将其用于在.env
上公开相关信息变量(提醒:您只能将基元和对象放在全局对象上,而不是实例上)。
在您的情况下,在套件之间传递连接池的要求可能不适合开玩笑,因为它永远不会让您在不同套件之间传递实例(至少基于我共享的所有链接,这是我的理解)。但是,您可以尝试以下任一方法:
Miscalenous:我偶然发现了here,它也可能满足您的需求(使用您的连接池设置抽象测试类,并在所有必需的测试中继承它)-我没有尝试过,所以我没有知道Jest会如何工作,但是当我用Java编写时,这就是我们过去使用global
答案 1 :(得分:1)
在每个测试文件中,您可以定义一个函数来加载必要的数据或模拟数据。为此,请使用beforeEach()函数。 Documentation example here!