Использование файлов .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();
Почему он этого не понял, я понятия не имею, но просто оставил работу по умолчанию.
Ответ 3
Ничто из этого не помогло мне, но я нашел отличную статью о настройке dotenv по умолчанию в Jest в package.json:
{
"scripts": {
"test": "jest --setupFiles 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);
});
});