🎉
【過去Blogからの移行記事】Laravelのテストにて use RefreshDatabase を使ってシーダー流すまで
とりあえず、殴り書きレベルでメモを公開しておく。
実行環境情報
- OS: Mac Sierra or Windows10
- php: 7.2.7
- Laravel Framework: 5.5.42
- PHPUnit: 6.5.11
testsディレクトリと関連ファイルの構成
projectDir/
├ app/
├ bootstrap/
├ ...
├ ~~省略~~
├ ...
├ database/
│ ├ factories/
│ ├ migrations/
│ └ seeds/
│ └ TestSeeder.php
├ tests/
│ ├ Feature/
│ │ ├ BaseFeature.php
│ │ └ Hoge.php
│ ├ Unit/
│ ├ CreatesApplication.php
│ └ TestCase.php/
├ vendor/
├ ...
├ ~~省略~~
├ ...
└ phpunit.xml
\Tests\Feature\BaseFeature.php の内容
<?php
namespace Tests\Feature;
use Tests\TestCase;
use Illuminate\Contracts\Console\Kernel;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\RefreshDatabaseState;
class BaseFeature extends TestCase
{
use RefreshDatabase {
refreshTestDatabase as originRefreshTestDatabase;
}
/**
* 元々 trait RefreshDatabase に記述されている refreshTestDatabase() の処理内容に
* artisan db:seed --class=TestSeeder
* を追加した。
*
* @see RefreshDatabase::refreshTestDatabase()
* @throws \Exception
*/
protected function refreshTestDatabase()
{
// parent::originRefreshTestDatabase(); /* 下記で完全に置き換えた */
if (! RefreshDatabaseState::$migrated) {
$this->artisan('migrate:fresh');
$this->app[Kernel::class]->setArtisan(null);
$this->artisan('db:seed', ['--class'=>'TestSeeder']);
RefreshDatabaseState::$migrated = true;
}
$this->beginDatabaseTransaction();
}
}
\Tests\Feature\Hoge.php の内容(BaseFeatureを継承)
<?php
namespace Tests\Feature;
use Tests\Feature\BaseFeature;
class HogeTest extends BaseFeature
{
public function testHoge()
{
$this->assertTrue(true);
}
}
テストを実行
※無論、予め phpunit.xml でテスト用のDBを操作するように変更しておくこと。
$ ./vendor/bin/phpunit tests/Feature/HogeTest.php --debug
これで、setUp() にて
artisan migrate:fresh
と
artisan db:seed --class="TestSeeder"
が実行された上で HogeTest の各テストメソッドが実行される。
Discussion