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

时间:2019-02-12 15:57:53

标签: javascript testing jestjs

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

2 个答案:

答案 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上公开相关信息变量(提醒:您只能将基元和对象放在全局对象上,而不是实例上)。

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

  • 将所有需要相同连接池的测试放到一个套件/文件中(虽然不太好,但可以满足您的需求)
  • 执行与我建议的操作类似的操作(在全局设置数据库一次,在自定义环境中构造连接池,然后至少每个套件都拥有自己的池),这样您可以大量重复使用代码进行设置,这很好。 custom envrironment对此进行了类似的讨论。

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

实现类似功能的方式

答案 1 :(得分:1)

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