177 votes

Tester process.env avec Jest

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

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

Et je voudrais tester cela par exemple :

  • APP_PORT peut être défini par une variable d'environnement Node.js.
  • ou qu'un Express.js s'exécute sur le port défini avec process.env.APP_PORT

Comment puis-je réaliser cela avec Jest ? Puis-je définir ces process.env avant chaque test ou dois-je le simuler d'une manière ou d'une autre ?

0 votes

Oui, vous pouvez définir la variable d'environnement

0 votes

@Deep AFAIK Je ne peux les définir qu'une seule fois dans la configuration de jest.

246voto

Tomasz Mularczyk Points 12030

La façon dont je l'ai fait peut être trouvée dans cette question Stack Overflow .

Il est important d'utiliser resetModules avant chaque test et ensuite importer dynamiquement le module à l'intérieur du test :

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

Si vous cherchez un moyen de charger les valeurs d'environnement avant d'exécuter le Jest, recherchez la fonction réponse ci-dessous . Vous devez utiliser setupFiles pour ça.

2 votes

Veuillez fournir la réponse complète

0 votes

Ça a bien marché pour moi. Si vous avez besoin d'utiliser une exportation par défaut, vous pouvez faire : const testedModule = require('../../config/env').default ;

12 votes

Au cas où cela ne fonctionnerait pas pour vous, assurez-vous que lorsque vous lisez la variable env dans votre code réel, vous la lisez dans une fonction/portée limitée plutôt que d'avoir une variable globale pointant sur process.env.YOUR_VARIABLE.

39voto

jahller Points 141

Une autre option consiste à l'ajouter à la jest.config.js après le fichier module.exports définition :

process.env = Object.assign(process.env, {
  VAR_NAME: 'varValue',
  VAR_NAME_2: 'varValue2'
});

De cette façon, il n'est pas nécessaire de définir les variables d'environnement dans chaque .spec et ils peuvent être ajustés globalement.

2 votes

C'est une réponse fantastique. Merci.

0 votes

C'est la seule réponse qui a fonctionné pour moi. Je vous remercie.

29voto

Serhan C. Points 49

Vous pouvez utiliser le setupFiles de la configuration de Jest. Comme la documentation dit que,

Une liste de chemins d'accès aux modules qui exécutent du code pour configurer ou paramétrer. l'environnement de test. Chaque fichier de configuration sera exécuté une fois par test. test. Comme chaque test s'exécute dans son propre environnement, ces scripts seront être exécutés dans l'environnement de test immédiatement avant d'exécuter le code de test lui-même.

  1. npm install dotenv dotenv qui permet d'accéder aux variables d'environnement.

  2. Créez votre .env dans le répertoire racine de votre application et ajoutez-y cette ligne :

    #.env
    APP_PORT=8080
  3. Créez votre fichier de module personnalisé comme son nom l'indique certainsModuleForTest.js et ajoutez-y cette ligne :

    // someModuleForTest.js
    require("dotenv").config()
  4. Mettez à jour votre jest.config.js comme ceci :

    module.exports = {
      setupFiles: ["./someModuleForTest"]
    }
  5. Vous pouvez accéder à une variable d'environnement dans tous les blocs de test.

    test("Some test name", () => {
      expect(process.env.APP_PORT).toBe("8080")
    })

4voto

RobW Points 2202

Selon la façon dont vous pouvez organiser votre code, une autre option peut consister à placer la variable d'environnement dans une fonction qui est exécutée au moment de l'exécution.

Dans ce fichier, la variable d'environnement est définie au moment de l'importation et nécessite une dynamique require afin de tester différentes variables d'environnement (comme décrit dans la section 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 d'environnement est fixée à envMessage temps d'exécution, et vous devriez être capable de muter 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 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(...

0voto

andy Points 739

Je pense que vous pourriez essayer ça aussi :

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

// test code...

process.env = currentEnv;

Cela fonctionne pour moi et vous n'avez pas besoin de modules.

1 votes

Le problème est que si vous importez un autre fichier qui utilise process.env alors le changer directement n'aura aucun effet. Donc avant chaque test, vous devez dire à Jest quelque chose comme - "hey importe et exécute ce fichier à nouveau".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X