Променливите на средата са недефинирани в 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
Страхотно, проработи! И благодаря за линка към PR-а. Срещнах нов проблем, който беше лесен за разрешаване. Ще го добавя към отговора ви за пълнота. И добре дошли в 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

Предложеният начин за зареждане на променливи на средата във вашата тестова среда е да добавите конфигурационен файл за шега, да добавите скрипт за настройка и в този скрипт да използвате включената loadEnvConfig функция NextJS.

.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