経緯
- 今担当しているプロダクトのテストコードを動かしていたら、特定のテストを実施した際にDBのレコードが変更され、他のテストが通らなくなる事態が発生してた.
-
データベースのテスト 5.4 LaravelにあるようにDatabaseTransactions使ってるのになんでかなーと色々調べた結果、setupでDBいじってたのが原因とわかった.
- DatabaseTransactionsは
各テストケースをデータベーストランザクションでラップしてしまう
ので、setupはトランザクション外なのね.
- DatabaseTransactionsは
- 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();
とすればトランザクション内での処理になります.