Jestjs Jest在每个测试套件和测试用例之间初始化和共享对象一次

Jestjs Jest在每个测试套件和测试用例之间初始化和共享对象一次,jestjs,Jestjs,我想在jest测试套件之间使用共享资源。我在网上读到,发现这可能是解决办法。但是每个测试文件都会调用设置 我有两个测试文件links.test.js和'subscriptpions.test.js'。我通常用一个命令来调用它们 问题在于我的自定义环境custom environment.js的设置功能: const NodeEnvironment = require('jest-environment-node'); const MySql = require('../../lib/datab

我想在jest测试套件之间使用共享资源。我在网上读到,发现这可能是解决办法。但是每个测试文件都会调用
设置

我有两个测试文件
links.test.js
和'subscriptpions.test.js'。我通常用一个命令来调用它们

问题在于我的自定义环境
custom environment.js的
设置
功能:

const NodeEnvironment = require('jest-environment-node');

const MySql = require('../../lib/databases/myslq/db');

class CustomEnvironment extends NodeEnvironment {
    constructor(config) {
        super(config)
    }

    async setup() {
        await super.setup();
        console.log(`Global Setup  !!!!!!!!!`);
        this.global.gObject = "I am global object"
        this.global.liveUsers = await new MySql("Live Users");
        this.global.stageUsers = await new MySql("Stage Users");
    }

    async teardown() {
        console.log(`Global  terdown  !!!!!!!!!`);
        await super.teardown();
        this.global.gObject = "I am destroyed";
        this.global.liveUsers.closeConnection();
        this.global.stageUsers.closeConnection();
    }

    runScript(script) {
        return super.runScript(script)
    }

 }

module.exports = CustomEnvironment;
每次测试调用两次:

全球设置!!!!!!!!! 全球设置!!!!!!!!! 错误>>>错误:侦听EADDRINUSE:地址已在使用127.0.0.1:3306

因此,它试图建立到同一端口的第二个连接,而我可以简单地使用现有的连接

在我看来,它的工作方式与定义没有区别

beforeAll(async () => {
});
afterAll(() => {
});
钩子


总而言之,问题是:使用
jest
命令(从而运行所有测试套件),如何为所有测试调用一次setup函数并在它们之间共享全局对象?

setup
teardown
确实为每个测试套件执行,类似于顶级的
之前
之后

测试套件在单独的进程中运行。测试环境针对每个测试套件进行初始化,例如,
jsdom
environment为每个套件提供假DOM实例,并且不能在它们之间交叉污染

正如文件所述

注意:测试环境是沙盒。每个测试套件将在其自己的测试环境中触发设置/拆卸

该环境不适合全局设置和拆卸。应该用这个。它们适用于设置和关闭服务器实例,这是文档示例显示的内容:

// setup.js
module.exports = async () => {
  // ...
  // Set reference to mongod in order to close the server during teardown.
  global.__MONGOD__ = mongod;
};

// teardown.js
module.exports = async function () {
  await global.__MONGOD__.stop();
};

由于这是在父进程中发生的,
\uuuuu MONGOD\uuuu
在测试套件中不可用。

我准备了两个文件
setup.js
teardown.js
,并将它们添加到jest.config中,但它们没有被调用。注意:通过globalSetup定义的任何全局变量只能在globalTeardown中读取。您无法检索在测试套件中定义的全局变量。
我不知道如果您做的一切都正确,如何调用它们,请尝试在那里抛出
以查看它们是否真的不正确。至于一次性调用设置功能,测试并在它们之间共享全局对象-这些要求是不兼容的,答案解释了原因。如果需要保持单个数据库连接,可以使用
runInBand
选项和套件设置/拆卸(使用自定义环境或通过
setupfileafterenv
)来实现。这可能会减慢测试速度,我不确定在您的情况下是否有必要这样做。该错误表示您试图同时侦听服务器。如果您可以提供多个DB连接,则只能启动一台具有全局设置/拆卸功能的服务器,并为每个套件创建一个连接。这主要取决于您如何处理DB。我将其用作解决方法。我为每个连接打开多个本地端口。我尝试不同的端口直到成功