我有一个应用程序,它依赖于环境变量,如:
const APP_PORT = process.env.APP_PORT || 8080;
我想测试一下,比如:
APP_PORT可以通过Node.js环境变量设置。 或者Express.js应用程序运行在process.env.APP_PORT的端口集上
我如何用Jest实现这一点?我可以设置这些流程吗?env变量之前每个测试或我应该以某种方式模拟它可能?
我有一个应用程序,它依赖于环境变量,如:
const APP_PORT = process.env.APP_PORT || 8080;
我想测试一下,比如:
APP_PORT可以通过Node.js环境变量设置。 或者Express.js应用程序运行在process.env.APP_PORT的端口集上
我如何用Jest实现这一点?我可以设置这些流程吗?env变量之前每个测试或我应该以某种方式模拟它可能?
当前回答
Jest的setupFiles是处理这个问题的正确方法,并且您不需要安装dotenv,也不需要使用.env文件来使其工作。
jest.config.js:
module.exports = {
setupFiles: ["<rootDir>/.jest/setEnvVars.js"]
};
jest / setEnvVars . js:
process.env.MY_CUSTOM_TEST_ENV_VAR = 'foo'
就是这样。
其他回答
我觉得你也可以试试这个:
const currentEnv = process.env;
process.env = { ENV_NODE: 'whatever' };
// test code...
process.env = currentEnv;
这适用于我,你不需要模块的东西
我有最简单的实现env (specialtest .env)
require("dotenv").config({ path: './test.env' });
const { sum } = require('./sum.js');
describe('sum', () => {
beforeEach(() => {
jest.resetModules(); // remove cache
})
test('should success', () => {
expect(sum(1, 3)).toEqual(4);
})
})
如果使用require("dotenv"),以上所有方法都有效。这是一个没有TypeScript的NodeJS应用程序,如Jialx或Henry Tipantuna所建议的那样。
但如果你在使用ts-jest并且在jest。config。ts文件中。
import dotenv from "dotenv"
dotenv.config()
/* config options below */
根据组织代码的方式,另一种选择是将环境变量放在运行时执行的函数中。
在这个文件中,环境变量是在导入时设置的,并且需要动态的要求,以便测试不同的环境变量(如本回答所述):
const env = process.env.MY_ENV_VAR;
const envMessage = () => `MY_ENV_VAR is set to ${env}!`;
export default myModule;
在这个文件中,环境变量是在envMessage执行时设置的,您应该能够改变进程。Env直接在您的测试中:
const envMessage = () => {
const env = process.env.MY_VAR;
return `MY_ENV_VAR is set to ${env}!`;
}
export default myModule;
有一个测试:
const vals = [
'ONE',
'TWO',
'THREE',
];
vals.forEach((val) => {
it(`Returns the correct string for each ${val} value`, () => {
process.env.MY_VAR = val;
expect(envMessage()).toEqual(...
在我看来,如果您将环境变量的检索提取到一个实用程序中(如果没有设置环境变量,您可能希望包含一个快速失败的检查),那么您就可以模拟该实用程序,这样会更清晰、更容易理解。
// util.js
exports.getEnv = (key) => {
const value = process.env[key];
if (value === undefined) {
throw new Error(`Missing required environment variable ${key}`);
}
return value;
};
// app.test.js
const util = require('./util');
jest.mock('./util');
util.getEnv.mockImplementation(key => `fake-${key}`);
test('test', () => {...});