it-swarm.com.de

test process.env mit Jest

Ich habe eine App, die von Umgebungsvariablen abhängt, wie:

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

und ich möchte das zum Beispiel testen:

  • APP_PORT kann durch die Umgebungsvariable des Knotens festgelegt werden.
  • oder dass eine express-App auf dem mit process.env.APP_PORT festgelegten Port ausgeführt wird

Wie kann ich das mit Jest erreichen? Kann ich diese process.env-Variablen vor jedem Test setzen oder sollte ich es vielleicht irgendwie verspotten?

19

Die Art und Weise, wie ich es getan habe kann in dieser SO Frage gefunden werden.

Es ist wichtig, dass Sie vor jedem Test resetModules und anschließend das Modul dynamisch in den Test importieren:

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

Je nachdem, wie Sie Ihren Code organisieren können, besteht eine weitere Möglichkeit darin, die Variable env in eine zur Laufzeit ausgeführte Funktion einzufügen.

In dieser Datei wird die Env-Variable zum Importzeitpunkt festgelegt und erfordert dynamische requires, um verschiedene Env-Variablen zu testen (wie in diese Antwort beschrieben):

const env = process.env.MY_ENV_VAR;

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

export default myModule;

In dieser Datei ist für env var die Ausführungszeit envMessage festgelegt, und Sie sollten in der Lage sein, process.env direkt in Ihren Tests zu mutieren:

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

export default myModule;

Scherztest:

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

Ich denke, Sie könnten das auch versuchen:

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

// test code...

process.env = currentEnv;

Das funktioniert bei mir und du brauchst keine Modulsachen

0
andy