在测试设置期间如何在 Jest 中保存全局值?

问题描述 投票:0回答:4

我在 Jest 中有一个全局设置。

"jest": {
    "globalSetup": "./setup.js"
  }

在设置中,我有一个异步函数,它将会话密钥写入全局

const axios = require('axios');

async function getSessionKey() {
    const response = await axios.post("http://apiUrl", {
        username: "K",
        password: "passw0rd"
    });
    sessionKey = response.data.sessionKey;
    global.sessionKey = sessionKey;
}

module.exports = getSessionKey;

我在全局中保存的任何会话密钥在测试文件中都不可用。 global.sessionKey 在下面的测试中未定义。

test("create session", () => {
    expect(global.sessionKey).toBeTruthy();
});

我想要某种方法来从设置文件中设置全局对象中的 sessionKey 。在运行任何测试之前,会话密钥应该可用。

jestjs
4个回答
7
投票

globalSetup
/
globalTeardown
不能用于将上下文/全局变量注入沙盒测试套件/文件。请改用
setupFiles
/
setupFilesAfterEnv

您可以通过

testEnvironment
自定义测试运行时,更多详细信息请参见此处:使用Jest异步设置环境


6
投票

process.env.SESSION_KEY = sessionKey
设置像
globalSetup
这样的环境变量似乎在后续测试中对我有用。

我可以从任何测试中正确访问该值。不确定这是错误还是功能。


4
投票

我花了很多时间来弄清楚这一点。唯一完全有效的解决方案是使用测试环境。这可以正确支持异步函数和全局函数。每个测试套件都使用测试环境的单独实例。

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

class TestEnvironment extends NodeEnvironment {
  constructor(config) {
    super(config);
  }

  async setup() {
    await super.setup();
    this.global.db = await asyncCode();
  }

  async teardown() {
    this.global.db = null;
    await asyncCode2();
    await super.teardown();
  }

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

module.exports = TestEnvironment;

我在 Jest 配置中添加了对此文件的引用:

"testEnvironment": "./testEnvironment"
对于文件
testEnvironment.js

我不确定为什么有这么多不同的配置选项,例如 setupFiles、globals、testEnvironment...


0
投票

jest 开发服务器可以为每次测试运行启动/关闭本地开发服务器,暴露此类服务后面的缓存将是跨测试/套件保存数据的一种方法。虽然看起来就像拿着锤子敲开坚果。

© www.soinside.com 2019 - 2024. All rights reserved.