Установите 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'   => '',
],
*/

Мы могли бы использовать это:)

Есть ли способ установить это глобально для всех тестов? Нужно ли устанавливать соединение в каждом тестовом случае?

Любая помощь была оценена.

Ответы

Ответ 1

На самом деле это довольно просто.

Создайте тестовую базу данных в своей папке storage/ с именем database.sqlite или если вы хотите, чтобы другое имя или другое местоположение вам нужно было изменить в файле 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> node:

<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 или в команде миграции

Ответ 2

У меня есть немного другое решение. Я использую в памяти базу данных sqlite.

сначала я изменяю значение по умолчанию, а затем добавляю новое соединение с базой данных .php в конфигурации

'default' => env('DB_CONNECTION', 'mysql'),

...

'testing' => [
    'driver' => 'sqlite',
    'database' => ':memory:',
    'prefix' => '',
],

Затем я добавляю следующую строку в phpunit.xml

<env name="DB_CONNECTION" value="testing"/>

Я оставляю файл .env нетронутым. Таким образом, соединение с базой данных будет по умолчанию "mysql"


Вот полный phpunit.xml для большей ясности

<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"
     backupStaticAttributes="false"
     bootstrap="bootstrap/autoload.php"
     colors="true"
     convertErrorsToExceptions="true"
     convertNoticesToExceptions="true"
     convertWarningsToExceptions="true"
     processIsolation="false"
     stopOnFailure="false"
     syntaxCheck="false">
<testsuites>
    <testsuite name="Application Test Suite">
        <directory>./tests/</directory>
    </testsuite>
</testsuites>
<filter>
    <whitelist>
        <directory suffix=".php">app/</directory>
    </whitelist>
</filter>
<logging>
    <log type="coverage-html" target="./report/" charset="UTF-8"
         yui="true" highlight="false" 
         lowUpperBound="50" highLowerBound="80"/>
</logging>    
<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_CONNECTION" value="testing"/>
</php>
</phpunit>