В Laravel можно просто задать переменные среды, специфичные для вашего тестового окружения. Просто отредактируйте свой файл phpunit.xml и задайте их как записи блока <php>:
xml<php> <env name="APP_ENV" value="testing"/> <env name="CACHE_DRIVER" value="array"/> <env name="SESSION_DRIVER" value="array"/> <env name="QUEUE_DRIVER" value="sync"/> <env name="DB_DATABASE" value=":memory:"/> <env name="DB_CONNECTION" value="sqlite"/> <env name="TWILIO_FROM_NUMBER" value="+15005550006"/> </php>
Но что делать, если вам вдруг понадобилось исключить их из контроля версий?
Мой пример
Я возвращаюсь к работе над PulledOver, в основе которого используется Twilio. Я захотел написать несколько тестов для моего класса TwilioClient, который напрямую подключается к API Twilio. Я использовал тестовые учётные данные Twilio для отправки ложных вызовов к API и проверки его ответов.
А это значит, что у меня есть SID и токен для Twilio , которые мне не нужно никому показывать, так? Я даже спросил в твиттере:
- Matt Stauffer @stauffermatt
- #geek
- Что может случиться, если при работе с тестовыми учётными данными @twilio загрузить их в систему контроля версий? Не лучше было бы...
Я получил несколько ответов, и один из них от CEO Twilio (!):
- Jeff Lawson @jeffiel
- @stauffermatt @twilio Лучше их не загружать. Ведь мы можем ограничить скорость запросов к API для определённой учётной записи, а если весь мир будет использовать твою учётку...
Ок, значит мне надо исключить их. Но как? Я поразмыслил немного, написал вопрос в наш корпоративный мессенджер Slack, и отправился спать. А проснувшись обнаружил, что мне ответил всегда находчивый Кейт Дамьяни: используй Dotenv (который используется в Laravel для загрузки .env), чтобы загружать файл .env.test в базовом классе Laravel TestCase. ФУХ. Вот как это делается:
Использование .env.test в Laravel
Сначала создайте файл .env.test.example и заполните его заготовками для необходимых вам ключей:
confTWILIO_ACCOUNT_SID=fillmein TWILIO_ACCOUNT_TOKEN=fillmein
Далее скопируйте .env.test.example в .env.test и заполните настоящими значениями.
Добавьте .env.testв свой файл .gitignore.
И наконец, в метод PHPcreateApplication()
файла tests/TestCase.php добавьте такую строку: PHP$app = require __DIR__.'/../bootstrap/app.php';
.
Недавно изменился синтаксис Dotenv, поэтому я покажу две разные версии:
// Старый Dotenv
if (file_exists(dirname(__DIR__) . '/.env.test')) {
Dotenv::load(dirname(__DIR__), '.env.test');
}
// Новый Dotenv
if (file_exists(dirname(__DIR__) . '/.env.test')) {
(new \Dotenv\Dotenv(dirname(__DIR__), '.env.test'))->load();
}
Вот и всё! Ваши переменные среды .env.test теперь помещены во все запускаемые тесты, которые наследуют TestCase, но эти значения безопасно хранятся вне контроля версий.