Lumen 5.2のPHPUnitでのユニットテストでテスト専用のDBを使うやり方が公式だとよくわからなかったのですが、
このあたりにありました。
https://laracasts.com/discuss/channels/testing/how-to-specify-a-testing-database-in-laravel-5
.envに書いたりとか、configファイルを作ったりとか色々なやり方があるようですが、
自分の環境では最も簡単にできるシンプルなやり方がわかりました。
例えば、開発用にMySQLで"dbname_dev"という名前のDBを使っていて、
PHPunitでのユニットテスト専用に同じMySQLサーバー内の"dbname_test"というDBを使う時
同じMySQLサーバーなので、DB_DATABASEの名前のみをphpunit.xmlの最後らへんに設定します。
...
...
<php>
<env name="APP_ENV" value="testing"/>
<env name="CACHE_DRIVER" value="array"/>
+ <env name="DB_DATABASE" value="dbname_test"/>
</php>
</phpunit>
phpunit.xmlの変更だけだとartisanで "APP_ENV=testing php artisan migrate"
コマンドを打ったとしてもdbname_testのDBには反映されないのですが、
その必要もありません。
tests/TestCase.php の setUp() と tearDown() で以下のようにArtisanを実行するとテストのたびに
データをリセットできます。
(Facadeを使っているのでboostrap/app.phpの $app->withFacades(); をコメントインしてください。)
<?php
+ use Illuminate\Support\Facades\Artisan;
class TestCase extends Laravel\Lumen\Testing\TestCase
{
/**
* Creates the application.
*
* @return \Laravel\Lumen\Application
*/
public function createApplication()
{
return require __DIR__.'/../bootstrap/app.php';
}
+ public function setUp()
+ {
+ parent::setUp();
+ Artisan::call('migrate');
+ }
+ public function tearDown()
+ {
+ Artisan::call('migrate:reset');
+ parent::tearDown();
+ }
}
テストが終わった後にデータが残っていて欲しい時は、setUp(),tearDown()の内容を適宜書き換えるなどすればいいと思います。
追記)@niisan-tokyo さんからコメントいただきました。
DBのリセットにはそれ用にtraitが用意されているのでそちらを使った方が良いです。
追記) 最近、Laravel5.3にてphpunit.xmlに同様の記述をしたところ、設定を読み込んでくれなくて困りました。
答えは簡単で
php artisan config:clear
としたら反映されました。Laravelではconfigをキャッシュしていたのでした(Laravel初心者なのでなかなか気づけませんでした)。