web-dev-qa-db-fra.com

test process.env avec Jest

J'ai une application qui dépend de variables environnementales telles que:

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

et je voudrais tester cela par exemple:

  • APP_PORT peut être défini par la variable env du noeud.
  • ou qu'une application express est en cours d'exécution sur le port défini avec process.env.APP_PORT

Comment puis-je atteindre cet objectif avec Jest? Puis-je définir ces variables process.env avant chaque test ou devrais-je me moquer de cette façon?

19
Tomasz Mularczyk

La façon dont je l’ai fait peut être trouvée dans cette SO question .

Il est important de resetModules avant chaque test, puis d'importer dynamiquement le module à l'intérieur du test:

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

  beforeEach(() => {
    jest.resetModules() // this is important
    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
  });
});
21
Tomasz Mularczyk

En fonction de la manière dont vous pouvez organiser votre code, une autre option peut consister à placer la variable env dans une fonction exécutée à l'exécution.

Dans ce fichier, la variable env est définie au moment de l'importation et requiert requires dynamique pour tester différents vars env (comme décrit dans cette réponse ):

const env = process.env.MY_ENV_VAR;

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

export default myModule;

Dans ce fichier, la variable env est définie sur le temps d'exécution envMessage et vous devriez être en mesure de muter le fichier process.env directement dans vos tests:

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

export default myModule;

Test de plaisanterie:

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