test process.env с Jest

У меня есть приложение, которое зависит от переменных окружающей среды, таких как:

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

и я хотел бы проверить это, например:

  • APP_PORT может быть задан переменной env узла.
  • или что express приложение работает на порту, установленном с помощью process.env.APP_PORT

Как я могу достичь этого с помощью Jest? Могу ли я установить эти переменные process.env перед каждым тестом, или я должен каким-то образом издеваться над ним?

Ответ 1

То, как я это сделал , можно найти в этом вопросе.

Важно resetModules перед каждым тестом, а затем динамически импортировать модуль внутри теста:

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

  beforeEach(() => {
    jest.resetModules() // this is important - it clears the cache
    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
  });
});

Ответ 2

Вы можете использовать функцию setupFiles jest config. Как сказано в документации ,

Список путей к модулям, которые запускают некоторый код для настройки или настройки среда тестирования. Каждый установочный файл будет запускаться один раз за тест файл. Поскольку каждый тест выполняется в своей среде, эти сценарии будут выполняется в среде тестирования непосредственно перед выполнением сам код теста.

  1. npm install dotenv dotenv, который используется для доступа к переменной env.
  2. Создайте файл .env в корневом каталоге вашего приложения и добавьте в него эту строку.
#.env
APP_PORT=8080
  1. Создайте свой файл модуля под именем SomeModuleForTest.js и добавьте в него эту строку.
//someModuleForTest.js
require("dotenv").config()
  1. Обновите свой файл jest.config.js следующим образом
module.exports = {
  setupFiles: ["./someModuleForTest"]
}
  1. Вы можете получить доступ к переменной env во всех тестовых блоках.
test("Some test name", () => {
  expect(process.env.APP_PORT).toBe("8080")
})

Ответ 3

В зависимости от того, как вы можете организовать свой код, другим вариантом может быть помещение переменной env в функцию, которая выполняется во время выполнения.

В этом файле, то окр вар устанавливаются во время импорта, и требует динамического require для того, чтобы испытать различный ВАР ENV (как описано в этом ответе):

const env = process.env.MY_ENV_VAR;

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

export default myModule;

В этом файле env var устанавливается во envMessage выполнения envMessage, и вы должны иметь возможность изменять файл process.env непосредственно в своих тестах:

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

export default myModule;

Шутник:

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

Ответ 4

Я думаю, вы тоже можете попробовать это:

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

// test code...

process.env = currentEnv;

Это работает для меня, и вам не нужны модульные вещи

Ответ 5

Другой вариант - добавить его в файл jest.config.js после определения module.exports:

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

Таким образом, нет необходимости определять переменные ENV в каждом файле .spec, и их можно настраивать глобально.