Шутник:

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

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

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

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

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

 Deep Kakkar30 дек. 2017 г., 13:26
да, вы можете установить переменную среды
 Tomasz Mularczyk30 дек. 2017 г., 13:56
@ Глубокий AFAIK Я могу установить их только один раз в конфигурации Jest.

Ответы на вопрос(2)

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

В этом файле env var устанавливается во время импорта и требует динамическогоrequires для тестирования различных переменных env (как описано вэтот ответ):

const env = process.env.MY_ENV_VAR;

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

export default myModule;

В этом файле env var установлен в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(...

можно найти в этом вопросе.

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

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
  });
});
 Yves M.09 авг. 2018 г., 11:32
Пожалуйста, предоставьте полный ответ
 Aziz09 авг. 2018 г., 21:14
Отлично сработало для меня. Если вам нужно использовать экспорт по умолчанию, вы можете сделать: const testModule = require ('../../ config / env'). Default;
 Tomasz Mularczyk09 авг. 2018 г., 20:02
@YvesM. конечно. Уже сделал.
 PenguinSource18 февр. 2019 г., 21:51
в случае, если это не работает для вас, убедитесь, что когда вы читаете переменную env в своем фактическом коде, вы читаете ее в ограниченном объеме функции / функции, вместо того, чтобы указывать глобальные переменные на process.env.YOUR_VARIABLE.

Ваш ответ на вопрос