LoginSignup
3
4

More than 5 years have passed since last update.

LaravelでのテストでsetupでDBいじりたい場合の対処

Posted at

経緯

  • 今担当しているプロダクトのテストコードを動かしていたら、特定のテストを実施した際にDBのレコードが変更され、他のテストが通らなくなる事態が発生してた.
  • データベースのテスト 5.4 LaravelにあるようにDatabaseTransactions使ってるのになんでかなーと色々調べた結果、setupでDBいじってたのが原因とわかった.
    • DatabaseTransactionsは各テストケースをデータベーストランザクションでラップしてしまうので、setupはトランザクション外なのね.
  • setupでDBいじってるテストが結構あったので、楽な感じに直す方法を調べてみた.

対応

  • 単純にDatabaseTransactionsでやってたトランザクションの開始と終了をsetupで明示的にやることで対処.
  • DatabaseTransactionsは取り除く.
TestCase.php
class TestCase extends Illuminate\Foundation\Testing\TestCase
{
//    use DatabaseTransactions;

    public function setUp()
    {
        parent::setUp();
        $this->app->make('db')->beginTransaction();

        // データベースの処理
    }

    public function tearDown()
    {
        $this->app->make('db')->rollBack();
        parent::tearDown();
    }
}

補足

ちなみに、MySQLのtruncateはトランザクション外の処理になるので、上記のやり方でもDBのデータが壊れます.

truncate使ってる場合は DB::table($table)->delete(); とすればトランザクション内での処理になります.

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4