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

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 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(...

测试文件:

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

在./package.json的测试脚本中:

"scripts": {
   "test": "jest --setupFiles dotenv/config",
 }

进来。/环境:

APP_PORT=8080

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

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

我的方法可以在这个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。

在。/ package.json:

"jest": {
  "setupFiles": [
    "<rootDir>/jest/setEnvVars.js"
  ]
}

在。/嘲笑/ setEnvVars.js:

process.env.SOME_VAR = 'value';