我有一个依赖于环境变量的应用程序,例如:
const APP_PORT = process.env.APP_PORT || 8080;
我想测试一下,例如:
process.env.APP_PORT
我怎样才能用 Jest 做到这一点?我可以process.env在每次测试之前设置这些变量还是应该以某种方式模拟它?
process.env
我这样做的方式可以在这个 Stack_Overflow question 中找到。
重要的是在每次测试之前使用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。
Jest’ssetupFiles是处理此问题的正确方法,您无需安装dotenv,也无需使用.env文件即可使其工作。
setupFiles
dotenv
.env
jest.config.js:
jest.config.js
module.exports = { setupFiles: ["<rootDir>/.jest/setEnvVars.js"] };
.jest/setEnvVars.js:
.jest/setEnvVars.js
process.env.MY_CUSTOM_TEST_ENV_VAR = 'foo'
而已。