Я пытаюсь настроить модульное тестирование в Laravel 5.1. Следуя документации, я вижу следующее:
Laravel построен с учетом тестирования. Фактически, поддержка тестирования с помощью PHPUnit включена в комплект поставки
а также
При запуске тестов Laravel автоматически настроит среду конфигурации на тестирование. Laravel автоматически настраивает сеанс и кеш на драйвер массива во время тестирования, а это означает, что во время тестирования не сохраняются данные сеанса или кеша.
который является удивительным. Но … как я могу сообщить Laravel о подключении базы данных SQLite при запуске тестов?
В файле config / database.php есть только то, что прокомментировал код:
/* We might use this connection for unit tests 'sqlite' => [ 'driver' => 'sqlite', 'database' => storage_path().'/database.sqlite', 'prefix' => '', ], */
Мы могли бы использовать это 🙂
Есть ли способ установить это глобально для всех тестов? Нужно ли устанавливать соединитель в каждом тестовом случае?
Любая помощь оценивается.
На самом деле это довольно просто.
Создайте тестовую базу данных в вашем storage/
папке с именем database.sqlite
или если вы хотите, чтобы другое имя или другое местоположение вам нужно было изменить в файле config/database.php
, это config/database.php
по умолчанию:
'sqlite' => [ 'driver' => 'sqlite', 'database' => storage_path('database.sqlite'), 'prefix' => '', ],
У вас есть два варианта: вы либо редактируете ваш .env
либо просто указываете имя базы данных, в которой вы хотите выполнить свои миграции:
php artisan migrate --database=sqlite
Если вы предпочитаете редактировать свой .env
файл, нам нужно добавить новую переменную:
DB_CONNECTION=sqlite
Это потому, что Laravel по умолчанию использует MySQL, когда эта переменная отсутствует в файле .env
:
//config/database.php file 'default' => env('DB_CONNECTION', 'mysql'),
Теперь, когда наше приложение указывает на нашу базу данных sqlite, мы теперь можем запускать наши миграции и посев. После этого, если вы просто хотите запустить MySQL, удалите DB_CONNECTION=sqlite
из файла .env
.
Теперь, когда у вас есть ваши миграции в вашей тестовой базе данных, последним шагом является просто указать ваш SQLite в качестве базы данных по умолчанию для тестов.
В корневой папке у вас есть файл phpunit.xml
, откройте его и новую переменную в узле <php>
:
<env name="DB_CONNECTION" value="sqlite"/>
Теперь ваше приложение использует MySQL, а phpunit использует SQLite.
Помните, что если вы измените .env
чтобы изменить его на свою базу данных по умолчанию;
Будьте осторожны при выполнении своих миграций, если вы указали соединение в самой миграции, он попытается запустить его в этом соединении.
<?php use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class AdminUsersTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::connection('manage')->create('admin_users', function (Blueprint $t) { $t->increments('id'); $t->string('name'); $t->softDeletes(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::connection('manage')->dropIfExists('admin_users'); } }
Эта миграция будет всегда выполняться при подключении, независимо от того, что вы указали в файле .env
или в команде миграции
У меня есть немного другое решение. Я использую базу данных sqlite в памяти.
сначала я меняю значение по умолчанию, а затем добавляю новое подключение к database.php в config
'default' => env('DB_CONNECTION', 'mysql'), ... 'testing' => [ 'driver' => 'sqlite', 'database' => ':memory:', 'prefix' => '', ],
то я добавлю следующую строку в phpunit.xml
<env name="DB_CONNECTION" value="testing"/>
Я оставляю файл .env нетронутым. Таким образом, соединение с базой данных будет по умолчанию «mysql»