質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHPUnit

PHPUnitは、PHP向けのユニット・テスト向けフレームワークで、手動では手間のかかるテスト作業を自動化し、繰り返し実行することが可能です。

テスト駆動開発

テスト駆動開発は、 プログラム開発手法の一種で、 プログラムに必要な各機能をテストとして書き、 そのテストが動作する必要最低限な実装を行い コードを洗練させる、といったサイクルを繰り返す手法の事です。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

1回答

8408閲覧

Laravel5.6 テストコード実行後DB内データが破棄されない DatabaseTransactions

masateru2

総合スコア39

PHPUnit

PHPUnitは、PHP向けのユニット・テスト向けフレームワークで、手動では手間のかかるテスト作業を自動化し、繰り返し実行することが可能です。

テスト駆動開発

テスト駆動開発は、 プログラム開発手法の一種で、 プログラムに必要な各機能をテストとして書き、 そのテストが動作する必要最低限な実装を行い コードを洗練させる、といったサイクルを繰り返す手法の事です。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

1クリップ

投稿2018/08/27 05:22

###問題点
class ArticleTestuse DatabaseTransactions; という機能を使っています。
laravelでphpunit走らせた後にDBに入れたデータを自動で破棄してくれる機能です。
他のテストコードではしっかりとテスト走らせた後にデータが消えます。
class ArticleTest の方でも定義しているのですが、テスト走らせた後にDBからデータが消えません。

###以下試してみたこと
:function内で use を定義→そもそもエラーでした。
:dataProviderが関係あると思い、そこをコメントアウトし実行→結果変わらず
php artisan config:clear でキャッシュをクリア→特に変化無しです。
use位置を変更してみた→特に変化もなく、問題なかった。
他にも思いついた解決方法実行するのですが、今の所なぜデータが破棄されないのか全くわかりません。

問題点

<?php namespace Tests\Unit; use Tests\TestCase; use Illuminate\Foundation\Testing\WithoutMiddleware; use Illuminate\Foundation\Testing\DatabaseTransactions; use Auth; use App\User; use Illuminate\Support\Facades\Validator; use App\Article; use App\Http\Requests\ArticleCreateFormRequest; use Faker\Generator as Faker; class ArticleTest extends TestCase { //こちらが機能しない use DatabaseTransactions; /** * @group exa */ public function testNewArticleSend() { $falseAccess = $this->get('/articles/create'); $falseAccess->assertStatus(302); $user = factory(User::class)->create(); $trueAccess = $this->actingAs($user)->get('/articles/create'); $trueAccess->assertStatus(200); $table = 'article'; $article = factory(Article::class)->create(); $this->assertDatabaseHas($table, $article->toArray()); } /** * @dataProvider dataProviderNewArticle * @group exa */ public function testExample($dataList, $expect) { $request = new ArticleCreateFormRequest(); $rules = $request->rules(); $validator = Validator::make($dataList, $rules); $result = $validator->passes(); $this->assertEquals($expect, $result); } public function dataProviderNewArticle(){ $faker = \Faker\Factory::create(); return[ [ [ 'articleTitle' => $faker->sentence(), 'articleDescription' => $faker->sentence(), 'articleBody' => $faker->userName(), 'authorId' => $faker->numberBetween(8, 10), 'typeId' => $faker->numberBetween(1, 2), 'categoryId' => $faker->numberBetween(10, 17), 'tagIds' => $faker->numberBetween(11, 19), 'postDate' => $faker->date(), 'postTime' => $faker->time(), 'articleThumbnail' => $faker->userName() ], true ], [ [ 'articleTitle' => '', 'articleBody' => '', 'articleDescription' => '', 'articleBody' => '', 'authorId' => '', 'typeId' => '', 'categoryId' => '', 'tagIds' => '', 'postDate' => '', 'postTime' => '', 'articleThumbnail' => '', ], false ], [ [ 'articleTitle' => str_repeat('a', 256), 'articleBody' => '', 'articleDescription' => str_repeat('a', 256), 'articleBody' => '', 'authorId' => '', 'typeId' => '', 'categoryId' => '', 'tagIds' => '', 'postDate' => str_repeat('a', 256), 'postTime' => '', 'articleThumbnail' => str_repeat('a', 256) ], false ], ]; } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/08/27 06:45

コードちゃんと読めてないですがcommitはどのようにして行われるのでしょうか。
masateru2

2018/08/27 07:08

$article = factory(Article::class)->create(); こちらのメソッドでファクトリーのデータをファクトリー内で指定したテーブルに入れています
m.ts10806

2018/08/27 07:16

私が聞いたことに対しての返答になっていませんよ。transactionのcommitがどう行われるのか聞いています。
masateru2

2018/08/27 07:25

これで分からないなら今回の問題も解決できないと思うのでもう大丈夫ですよ。
m.ts10806

2018/08/27 07:35

そうですか。それは大変残念です。
guest

回答1

0

ベストアンサー

class ArticleTestで use DatabaseTransactions; という機能を使っています。
laravelでphpunit走らせた後にDBに入れたデータを自動で破棄してくれる機能です。

私はいつも RefreshDatabase を使っています。
逆に DatabaseTransactions を使っていないので調べてみましたが、 RefreshDatabase の方が新しい機能のようです。
5.6ならこちらを使ったほうが良さそうですね。

https://readouble.com/laravel/5.5/ja/database-testing.html

https://qiita.com/Frog_woman/items/6a143af0a042dc853e88

https://www.webprofessional.jp/new-features-laravel-5-5/

class ArticleTest の方でも定義しているのですが、テスト走らせた後にDBからデータが消えません。

DatabaseTransactions トレイトの内部的な動作をわかっていないので、的外れかもしれませんが、一応、マイグレーションファイルの down をちゃんと定義しているか確認してみて下さい。

どうしてもトレイトが効かない原因が分からなければ下記のように setUp ファンクションに refresh をべた書きして実行させるという手もあると思います。

https://qiita.com/kuriya/items/4c9dbefc19514f415374

public function setUp() { parent::setUp(); Artisan::call('migrate:refresh'); Artisan::call('db:seed'); }

また、下記のissueが参考になるかもしれません。

https://github.com/laravel/framework/issues/10873

投稿2018/08/27 06:51

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

masateru2

2018/08/27 07:27

RefreshDatabase使ってみたのですが、テーブルまで破棄されてしまったので、そこらへんも含めて調べてみます!ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問