web-dev-qa-db-ja.com

Jestでprocess.envをテストする

次のような環境変数に依存するアプリがあります。

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

そして、例えばそれをテストしたいと思います:

  • APP_PORTは、ノードのenv変数によって設定できます。
  • またはexpressアプリがprocess.env.APP_PORTで設定されたポートで実行されていること

Jestでこれを達成するにはどうすればよいですか?各テストの前にこれらのprocess.env変数を設定できますか、それとも何らかの方法でモックする必要がありますか?

35

私がやった方法 このSO質問にあります

各テストの前に resetModules し、テスト内でモジュールを動的にインポートすることが重要です。

describe('environmental variables', () => {
  const OLD_ENV = process.env;

  beforeEach(() => {
    jest.resetModules() // this is important - it clears the cache
    process.env = { ...OLD_ENV };
    delete process.env.NODE_ENV;
  });

  afterEach(() => {
    process.env = OLD_ENV;
  });

  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
  });
});
44

コードの編成方法に応じて、実行時に実行される関数内にenv変数を配置することもできます。

このファイルでは、インポート時にenv変数が設定され、異なるenv変数をテストするために動的なrequiresが必要です( this answer で説明)。

const env = process.env.MY_ENV_VAR;

const envMessage = () => `MY_ENV_VAR is set to ${env}!`;

export default myModule;

このファイルでは、env変数はenvMessage実行時に設定され、テストで直接process.envを変更できるはずです。

const envMessage = () => {
  const env = process.env.MY_VAR;
  return `MY_ENV_VAR is set to ${env}!`;
}

export default myModule;

Jestテスト:

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

あなたもこれを試すことができると思います:

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

// test code...

process.env = currentEnv;

これは私のために機能し、モジュールのものは必要ありません

0
andy