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

时间:2018-01-30 14:45:28

标签: jestjs

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

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

3 个答案:

答案 0 :(得分:2)

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

您可以通过testEnvironment自定义测试运行时的其他方式,更多详细信息请参见此处:Async setup of environment with Jest

答案 1 :(得分:1)

我花了很多时间弄清楚这一点。唯一可以正常工作的解决方案是使用测试环境。这支持异步功能以及正确的全局变量。每个测试套件都使用一个单独的测试环境实例。

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 Config:"testEnvironment": "./testEnvironment"中为文件testEnvironment.js添加了对此文件的引用

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

答案 2 :(得分:0)

在后续测试中,从process.env.SESSION_KEY = sessionKey设置globalSetup之类的env变量似乎对我有用。

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