小编典典

用 Jest 测试 process.env

all

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

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

我想测试一下,例如:

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

我怎样才能用 Jest 做到这一点?我可以process.env在每次测试之前设置这些变量还是应该以某种方式模拟它?


阅读 73

收藏
2022-06-04

共1个答案

小编典典

我这样做的方式可以在这个 Stack_Overflow question
中找到

重要的是在每次测试之前使用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

Jest’ssetupFiles是处理此问题的正确方法,您无需安装dotenv,也无需使用.env文件即可使其工作。

jest.config.js

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

.jest/setEnvVars.js

process.env.MY_CUSTOM_TEST_ENV_VAR = 'foo'

而已。

2022-06-04