Установите SQLite в качестве базы данных для модульного тестирования в Laravel 5.1

Я пытаюсь настроить модульное тестирование в 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 чтобы изменить его на свою базу данных по умолчанию;

PS

Будьте осторожны при выполнении своих миграций, если вы указали соединение в самой миграции, он попытается запустить его в этом соединении.

 <?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»