web-dev-qa-db-fra.com

Invalider le cache de noeud lors de l'utilisation de Jest

J'ai un fichier avec un objet qui est rempli avec les propriétés 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;

Maintenant, j'essaie de tester ce fichier avec différentes propriétés 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');
  });
});

Malheureusement, même si j'essaie de charger le fichier dans chaque test séparément, le fichier n'est chargé qu'une seule fois, ce qui fait échouer le troisième test avec:

Expected value to equal:
  "dev"
Received:
  "production"

P.S. Il n'échoue pas lorsque j'exécute le test seul.

Je sais également que env.js ne se charge qu'une seule fois car console.log('LOADING env.js'); n'est renvoyé qu'une seule fois.

J'ai essayé d'invalider le cache des nœuds comme:

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

mais require.cache est vide {} avant chaque test, il semble donc que Jest soit en quelque sorte responsable de l'importation du fichier.

J'ai également essayé d'exécuter yarn jest --no-cache Mais je n'ai pas aidé.

Donc, ce que je veux, c'est charger env.js avant chaque test afin que je puisse tester comment il se comporte avec différentes variables d'environnement de nœud.

jest@^22.0.4

9
Tomasz Mularczyk

Vous pouvez utiliser jest.resetModules() dans la méthode beforeEach pour réinitialiser les modules déjà requis

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