我有一个应用程序,它依赖于环境变量,如:
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.config.js中导入这个
require('dotenv').config()
这对我很有用
其他回答
测试文件:
const APP_PORT = process.env.APP_PORT || 8080;
在./package.json的测试脚本中:
"scripts": {
"test": "jest --setupFiles dotenv/config",
}
进来。/环境:
APP_PORT=8080
您可以使用Jest配置的setupFiles特性。文档上说过,
运行要配置或设置的代码的模块的路径列表 测试环境。每个setupFile将在每个测试中运行一次 文件。因为每个测试都在自己的环境中运行,所以这些脚本会 在执行之前立即在测试环境中执行 测试代码本身。
npm install dotenv dotenv that uses to access environment variable. Create your .env file to the root directory of your application and add this line into it: #.env APP_PORT=8080 Create your custom module file as its name being someModuleForTest.js and add this line into it: // someModuleForTest.js require("dotenv").config() Update your jest.config.js file like this: module.exports = { setupFiles: ["./someModuleForTest"] } You can access an environment variable within all test blocks. test("Some test name", () => { expect(process.env.APP_PORT).toBe("8080") })
根据组织代码的方式,另一种选择是将环境变量放在运行时执行的函数中。
在这个文件中,环境变量是在导入时设置的,并且需要动态的要求,以便测试不同的环境变量(如本回答所述):
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(...
另一种选择是将其添加到模块之后的jest.config.js文件中。出口的定义:
process.env = Object.assign(process.env, {
VAR_NAME: 'varValue',
VAR_NAME_2: 'varValue2'
});
这样就不需要在每个.spec文件中定义环境变量,并且可以全局调整它们。
我觉得你也可以试试这个:
const currentEnv = process.env;
process.env = { ENV_NODE: 'whatever' };
// test code...
process.env = currentEnv;
这适用于我,你不需要模块的东西