【问题标题】:Jest initialize and shared objects once per test suite and across test casesJest 每个测试套件和跨测试用例初始化和共享对象一次
【发布时间】:2020-10-17 22:37:45
【问题描述】:

我想在 jest 测试套件之间使用共享资源。我在互联网上阅读并发现this 可能是解决方案。但是每个测试文件都会调用setup。

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

问题是我自定义环境custom-environment.js的setup函数:

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;

每次测试调用两次:

全局设置 !!!!!!!!! 全局设置!!!!!!!!! ERROR>>> Error: listen EADDRINUSE: address already in use 127.0.0.1:3306

所以它尝试建立到同一个端口的第二个连接——而我可以简单地使用现有的连接。

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

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

钩子。

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

【问题讨论】:

    标签: jestjs


    【解决方案1】:

    setup 和 teardown 确实为每个测试套件执行,类似于顶级 beforeAll 和 afterAll。

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

    如文档所述,

    注意:TestEnvironment 是沙盒的。每个测试套件都会在自己的 TestEnvironment 中触发 setup/teardown。

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

    // 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();
    };
    

    由于这发生在父进程中,__MONGOD__ 在测试套件中不可用。

    【讨论】:

    • 我准备了两个文件setup.js 和teardown.js 并将它们添加到 jest.config 中,但它们没有被调用。
    • 还有这个Note: Any global variables that are defined through globalSetup can only be read in globalTeardown. You cannot retrieve globals defined here in your test suites.
    • 我看不出如果你做的一切都正确,它们是如何不能被调用的,试着去throw看看它们是否真的不是。至于为所有测试调用一次设置函数并在它们之间共享全局对象 - 这些要求不兼容,答案解释了原因。
    • 如果您需要保持单个数据库连接,您可以使用runInBand 选项和套件设置/拆卸(使用自定义环境或通过setupFilesAfterEnv 的 beforeAll/afterAll)。这可能会减慢测试速度,我不确定您的情况是否有必要。该错误意味着您尝试同时收听服务器。如果您负担得起多个数据库连接,则可以仅启动 1 台具有全局设置/拆卸的服务器,并为每个套件创建一个连接。这主要取决于您如何处理数据库。
    • 这个stackoverflow.com/a/41095195/5598574 我用作解决方法。我为每个连接打开多个本地端口。我尝试不同的端口,直到成功
    猜你喜欢
    • 2023-03-20
    • 2015-10-19
    • 1970-01-01
    • 2019-07-06
    • 2020-01-24
    • 2016-07-13
    • 2017-05-26
    • 1970-01-01
    • 2018-08-01
    相关资源
    最近更新 更多