🎉

【過去Blogからの移行記事】Laravelのテストにて use RefreshDatabase を使ってシーダー流すまで

2022/09/18に公開

とりあえず、殴り書きレベルでメモを公開しておく。

実行環境情報

  • 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