我有一个应用程序,它依赖于环境变量,如:
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变量之前每个测试或我应该以某种方式模拟它可能?
当前回答
我的方法可以在这个Stack Overflow问题中找到。
在每次测试之前使用resetModules,然后在测试中动态导入模块是很重要的:
describe('environmental variables', () => {
const OLD_ENV = process.env;
beforeEach(() => {
jest.resetModules() // Most important - it clears the cache
process.env = { ...OLD_ENV }; // Make a copy
});
afterAll(() => {
process.env = OLD_ENV; // Restore old environment
});
test('will receive process.env variables', () => {
// Set the variables
process.env.NODE_ENV = 'dev';
process.env.PROXY_PREFIX = '/new-prefix/';
process.env.API_URL = 'https://new-api.com/';
process.env.APP_PORT = '7080';
process.env.USE_PROXY = 'false';
const testedModule = require('../../config/env').default
// ... actual testing
});
});
如果您在运行Jest之前寻找加载环境值的方法,请参见下面的答案。你应该使用setupFiles。
其他回答
当使用Typescript以下作品为我:
根: jest.config.js
/* eslint-disable @typescript-eslint/no-var-requires */ const {pathsToModuleNameMapper} = require('ts-jest'); const {compilerOptions} = require('./tsconfig.paths.json'); 模块。出口= { / /[…] moduleNameMapper: pathsToModuleNameMapper (compilerOptions。{prefix: '<rootDir>/'}), }; 的过程。env = Object.assign(进程。env, { env_name:“开发”, another_var:“abc123”, });
另一种选择是将其添加到模块之后的jest.config.js文件中。出口的定义:
process.env = Object.assign(process.env, {
VAR_NAME: 'varValue',
VAR_NAME_2: 'varValue2'
});
这样就不需要在每个.spec文件中定义环境变量,并且可以全局调整它们。
你可以在jest.config.js中导入这个
require('dotenv').config()
这对我很有用
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 APP_PORT = process.env.APP_PORT || 8080;
在./package.json的测试脚本中:
"scripts": {
"test": "jest --setupFiles dotenv/config",
}
进来。/环境:
APP_PORT=8080