我有一个应用程序,它依赖于环境变量,如:

const APP_PORT = process.env.APP_PORT || 8080;

我想测试一下,比如:

APP_PORT可以通过Node.js环境变量设置。 或者Express.js应用程序运行在process.env.APP_PORT的端口集上

我如何用Jest实现这一点?我可以设置这些流程吗?env变量之前每个测试或我应该以某种方式模拟它可能?


当前回答

根据@HenryTipantuña的建议,在jest.config.js中导入dotenv,并使用.env。config路径下的Test文件

require('dotenv').config({
  path: '.env.test'
})

其他回答

当使用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配置的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(...

在。/ 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'
})