web-dev-qa-db-ja.com

Jestの使用時にノードキャッシュを無効にする

_process.env_プロパティが設定されたオブジェクトを持つファイルがあります:

env.js

_console.log('LOADING env.js');

const {
  PROXY_PREFIX = '/api/',
  USE_PROXY = 'true',
  APP_PORT = '8080',
  API_URL = 'https://api.address.com/',
  NODE_ENV = 'production',
} = process.env;

const ENV = {
  PROXY_PREFIX,
  USE_PROXY,
  APP_PORT,
  API_URL,
  NODE_ENV,
};

module.exports.ENV = ENV;
_

ここで、さまざまな_process.env_プロパティを使用してこのファイルをテストします。

env.test.js

_const envFilePath = '../../config/env';

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

  beforeEach(() => {
    process.env = { ...OLD_ENV };
    delete process.env.NODE_ENV;
  });

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

  test('have default values', () => {
    const { ENV } = require(envFilePath);
    expect(ENV).toMatchSnapshot();
  });

  test('are string values (to avoid casting errors)', () => {
    const { ENV } = require(envFilePath);
    Object.values(ENV).forEach(val => expect(typeof val).toEqual('string'));
  });

  test('will receive process.env 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 { ENV } = require(envFilePath);

    expect(ENV.NODE_ENV).toEqual('dev');
    expect(ENV.PROXY_PREFIX).toEqual('/new-prefix/');
    expect(ENV.API_URL).toEqual('https://new-api.com/');
    expect(ENV.APP_PORT).toEqual('7080');
    expect(ENV.USE_PROXY).toEqual('false');
  });
});
_

残念ながら、すべてのテストでファイルを個別にロードしようとしても、ファイルは1回しかロードされず、3番目のテストは次のように失敗します。

_Expected value to equal:
  "dev"
Received:
  "production"
_

追伸テストを単独で実行しても失敗しません。

console.log('LOADING env.js');が1回だけ起動されるため、env.jsが1回しか読み込まれないことも知っています。

私は次のようなノードキャッシュを無効にしようとしました:

_  beforeEach(() => {
    delete require.cache[require.resolve(envFilePath)];
    process.env = { ...OLD_ENV };
    delete process.env.NODE_ENV;
  });
_

しかし、各テストの前の_require.cache_は空の_{}_であるため、Jestがファイルのインポートを何らかの形で担当しているようです。

_yarn jest --no-cache_も実行しようとしましたが、助けにはなりませんでした。

したがって、各テストの前にenv.jsをロードして、異なるノード環境変数での動作をテストできるようにします。

jest@^22.0.4

9

beforeEachメソッドで jest.resetModules() を使用して、すでに必要なモジュールをリセットできます

beforeEach(() => {
  jest.resetModules()
  process.env = { ...OLD_ENV };
  delete process.env.NODE_ENV;
});
24
Prakash Sharma