Использование файлов .env для модульного тестирования со шуткой

Можно ли загрузить переменные среды из файла env для целей модульного тестирования в Jest? Я хочу запустить серию тестов на нем, например, так:

// unit tests for env file
describe('env', () => {
    it('should have a client id', () => {
        expect(process.env.CLIENT_ID).toBeDefined();
    });
    it('should have a client secret', () => {
        expect(process.env.CLIENT_SECRET).toBeDefined();
    });
    it('should have a host', () => {
        expect(process.env.HOST).toBeDefined();
    });
    it('should have a scope', () => {
        expect(process.env.SCOPE).toBeDefined();
    });
    it('should have a response type', () => {
        expect(process.env.RESPONSE_TYPE).toBeDefined();
    });
    it('should have a redirect uri', () => {
        expect(process.env.REDIRECT_URI).toBeDefined();
    });
});

В настоящее время все вышеперечисленные тесты не пройдут, заявив, что переменные не определены. Первоначально я использовал настройку mocha/chai, которая позволяла мне загружать все переменные env с помощью dotenv. Это включало запуск всех модульных тестов через веб-пакет и работало нормально.

Однако, читая документацию, Jest не запускает тесты через веб-пакет; вместо этого модули извлекаются через moduleNameMapper. Это отлично работает для всего остального, но я не могу получить переменные файла env для загрузки. До сих пор я пытался использовать опцию setupFiles для js файла, который вызывает dotenv.config с указанным ему путем к файлу env:

// setup file for jest
const dotenv = require('dotenv');
dotenv.config({ path: './env' });

Это не сработало, поэтому я теперь прибегаю к использованию только файла .env.js для модульных тестов и передаю этот файл в опцию setupFiles. Тем не менее, для удобства обслуживания и для того, чтобы он работал с веб-пакетом для производства, я бы хотел сохранить все это в одном файле. Вот выдержка из того, как файл .env.js выглядит для справки.

// .env.js extract example
process.env.PORT = 3000;
process.env.HOST = 'localhost';
process.env.CLIENT_ID = 'your client id';
process.env.REDIRECT_URI = 'your callback endpoint';

Ответ 1

Ваш верхний путь конфигурации с помощью ./ относителен относительно точки инъекции, вероятно, ваш тестовый пакет может находиться внутри папки с именем test, из-за чего он не будет обнаружен при выполнении ваших модульных тестов. dotenv.config(); Использует глобальную стратегию впрыска, которая аналогична абсолютной траектории.

Ответ 2

Поэтому проблема требует изменения этого параметра:

dotenv.config({ path: './env' });

to:

dotenv.config();

Почему он этого не понял, я понятия не имею, но просто оставил работу по умолчанию.

Ответ 4

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

jest.config.js : 

module.exports = {
 ....
    setupFiles: ["<rootDir>/test/setup-tests.ts"]
}


test/test-setup.ts:

import dotenv from 'dotenv';
dotenv.config({path: './config.env.test'});

Ответ 5

Я немного опоздал, но надеюсь, что это поможет тем, кто ищет работу дотенв. Это просто расширенная версия того, что сказал @DavidDehghan. Так что добавьте установочный файл для запуска перед любой шуткой, как сказал Дэвид

Теперь, убедившись, что загрузка платформы для разрешения относительного пути загружена, используйте модуль path для разрешения папки.

import * as  dotenv from 'dotenv';
import * as path from 'path';

dotenv.config({ path: path.resolve(__dirname + './../config/testFolder/.env') });

Теперь в файле спецификации вы можете проверить, если process.env переменные содержит значение, загруженное из .env файла в testFolder

describe('Test suite - testing app service', () => {
  beforeAll(() => {
    console.log('coming inside beforeAll', process.env.LCp);

  });
});