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

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

我想测试一下,比如:

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

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


当前回答

在。/ package.json:

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

在。/嘲笑/ setEnvVars.js:

process.env.SOME_VAR = 'value';

其他回答

您可以使用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") })

Jest的setupFiles是处理这个问题的正确方法,并且您不需要安装dotenv,也不需要使用.env文件来使其工作。

jest.config.js:

module.exports = {
  setupFiles: ["<rootDir>/.jest/setEnvVars.js"]
};

jest / setEnvVars . js:

process.env.MY_CUSTOM_TEST_ENV_VAR = 'foo'

就是这样。

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

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

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

我觉得你也可以试试这个:

const currentEnv = process.env;
process.env = { ENV_NODE: 'whatever' };

// test code...

process.env = currentEnv;

这适用于我,你不需要模块的东西