web-dev-qa-db-ja.com

Laravel 5.1で単体テスト用のデータベースとしてSQLiteを設定します

Laravel 5.1でユニットテストをセットアップしようとしています。 documentation に続いて、私はこれを見る:

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'   => '',
],
*/

これを使用するかもしれません:)

すべてのテストでこれをグローバルに設定する方法はありますか?すべてのテストケースで接続を設定する必要がありますか?

任意の助けに感謝します。

23
lesssugar

実際には非常に簡単です。

storage/フォルダーにdatabase.sqliteという名前でテストデータベースを作成するか、config/database.phpファイルの構成を変更する必要がある別の名前または別の場所が必要な場合は、これらがデフォルトの構成です:

'sqlite' => [
    'driver'   => 'sqlite',
    'database' => storage_path('database.sqlite'),
    'prefix'   => '',
],

次の2つのオプションがあります。.envを編集するか、移行を実行するデータベースの名前を指定するだけです。

php artisan migrate --database=sqlite

.envファイルを編集する場合は、新しい変数を追加する必要があります。

DB_CONNECTION=sqlite

これは、この変数が.envファイルにない場合、LaravelはデフォルトでMySQLに設定されるためです。

//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ファイルまたは移行コマンドでの指定に関係なく、常に接続で実行されますmanage

34
Fabio Antunes

少し違う解決策があります。メモリ内のsqliteデータベースを使用しています。

最初にデフォルトを変更してから、configでdatabase.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>
8
cw24