我在 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 。在运行任何测试之前,会话密钥应该可用。
globalSetup
/globalTeardown
不能用于将上下文/全局变量注入沙盒测试套件/文件。请改用 setupFiles
/setupFilesAfterEnv
。
您可以通过
testEnvironment
自定义测试运行时,更多详细信息请参见此处:使用Jest异步设置环境
从
process.env.SESSION_KEY = sessionKey
设置像 globalSetup
这样的环境变量似乎在后续测试中对我有用。
我可以从任何测试中正确访问该值。不确定这是错误还是功能。
我花了很多时间来弄清楚这一点。唯一完全有效的解决方案是使用测试环境。这可以正确支持异步函数和全局函数。每个测试套件都使用测试环境的单独实例。
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...
jest 开发服务器可以为每次测试运行启动/关闭本地开发服务器,暴露此类服务后面的缓存将是跨测试/套件保存数据的一种方法。虽然看起来就像拿着锤子敲开坚果。