用 Jest 测试 process.env

新手上路,请多包涵

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

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

我想测试一下,例如:

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

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

原文由 Tomasz Mularczyk 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.9k
2 个回答

我这样做的方式 可以在这个 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

原文由 Tomasz Mularczyk 发布,翻译遵循 CC BY-SA 4.0 许可协议

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'

而已。

原文由 zgreen 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题