Переменные среды не определены в NextJS при запуске Jest

У меня настроен простой проект NextJS, и у меня проблемы с тем, чтобы Jest распознал переменные моей среды. Я выполнил инструкции на https://nextjs.org/docs/basic-features/environment-variables#test-environment-variables в меру своих возможностей, но не могу заставить его работать.

Вот упрощенная версия моей проблемы.

// .env.test.local
MY_ENVIRONMENT_VARIABLE=my_value
// My function I want to test
export const getEnvironment = () => {
  const MY_ENVIRONMENT_VARIABLE = process.env.MY_ENVIRONMENT_VARIABLE;
  return MY_ENVIRONMENT_VARIABLE;
};
// My test
import { getEnvironment } from './getEnvironment';

describe('Get environment', () => {
  it('will have the correct environment variable', () => {
    const myEnvironmentVar = getEnvironment();
    const expectedEnv = "my_value";
    expect(myEnvironmentVar).toEqual(expectedEnv);
  });
});

Я подшучиваю с jest --watch. Я вижу, что он получает среду test, но ни одна из моих собственных заданных переменных не отображается.

Приведенный выше тест не проходит с

Expected: "my_value"
Received: undefined

Если какие-то дополнительные файлы имеют отношение, прокомментируйте, и я добавлю то, что у меня есть.


person Per Enström    schedule 17.09.2020    source источник


Ответы (2)


Перед запуском теста необходимо создать экземпляр Next, чтобы иметь доступ к этим переменным среды.

    // include this in your Jest setup file, or before your tests
    import next from "next";
    next({});

В настоящее время существует запрос на перенос, чтобы добавить это в документацию Next: https://github.com/vercel/next.js/pull/16443

Обязательно соблюдайте соглашение об именах для клиентские переменные среды с префиксом NEXT_PUBLIC_, если переменная среды будет использоваться в клиентском коде.

person Christopher Borchert    schedule 17.09.2020
comment
Отлично, сработало! И спасибо за ссылку на пиар. Я столкнулся с новой проблемой, которую легко решить. Я добавлю его к вашему ответу для полноты картины. И добро пожаловать в Stackoverflow! - person Per Enström; 17.09.2020
comment
Проблема, о которой я упоминал в приведенном выше комментарии, была исправлена ​​в вопросе вместо этого ответа, чтобы соответствовать правилам редактирования ответов! - person Per Enström; 22.09.2020
comment
нужно использовать next({ dev: true }) - person mcmonkeys1; 12.12.2020

С тех пор, как я задал этот вопрос, документация была обновлена ​​и предоставила лучший ответ, чем начинать следующий полностью перед тестами.

https://nextjs.org/docs/basic-features/environment-variables#test-environment-variables

Предлагаемый способ загрузки переменных среды в среду тестирования - добавить файл конфигурации для jest, добавить сценарий установки и использовать в этом сценарии функцию NextJS, включенную loadEnvConfig.

.env.test можно заполнить фиктивными данными и зарегистрировать в вашем репо. Как и в случае с обычными переменными среды, вы можете переопределить их локально с помощью .env.test.local-файла.

// jest.config.js
module.exports = {
  globalSetup: '<rootDir>/__test__/setupEnv.js'
}
// __test__/setupEnv.js
import { loadEnvConfig } from '@next/env'

export default async () => {
  const projectDir = process.cwd()
  loadEnvConfig(projectDir)
}
# .env.test
MY_ENVIRONMENT_VARIABLE="a-variable-for-testing"
person Per Enström    schedule 16.06.2021