我有一个应用程序,它依赖于环境变量,如:
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变量之前每个测试或我应该以某种方式模拟它可能?
当前回答
在我看来,如果您将环境变量的检索提取到一个实用程序中(如果没有设置环境变量,您可能希望包含一个快速失败的检查),那么您就可以模拟该实用程序,这样会更清晰、更容易理解。
// 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', () => {...});
其他回答
在。/ package.json:
"jest": {
"setupFiles": [
"<rootDir>/jest/setEnvVars.js"
]
}
在。/嘲笑/ setEnvVars.js:
process.env.SOME_VAR = 'value';
根据@HenryTipantuña的建议,在jest.config.js中导入dotenv,并使用.env。config路径下的Test文件
require('dotenv').config({
path: '.env.test'
})
我有最简单的实现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);
})
})
在Serhan C上扩展了一点。的答案……
根据博客文章如何用笑话测试安装dotenv -深入解释,你可以直接在setupFiles中包含“dotenv/config”,而不必创建和引用调用require(“dotenv”).config()的外部脚本。
也就是说,简单地去做
module.exports = {
setupFiles: ["dotenv/config"]
}
你可以在jest.config.js中导入这个
require('dotenv').config()
这对我很有用