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' => '',
],
*/
これを使用するかもしれません:)
すべてのテストでこれをグローバルに設定する方法はありますか?すべてのテストケースで接続を設定する必要がありますか?
任意の助けに感謝します。
実際には非常に簡単です。
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
を変更してデフォルトのデータベースに戻す場合;
移行を実行するときは注意してください。移行自体で接続を指定した場合、その接続で実行しようとします。
<?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
少し違う解決策があります。メモリ内の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>