引き続きLaravelでphpUnitテストをする方法を学習しています。
前回の「掲示板投稿テスト」は単純なテキストを投稿してみるだけのシンプルなものでしたが、
もう少しブラッシュアップして色々な入力値でテストできるようにしてみました。
テストコード全体
public function dataproviderPostdata() { return [ 'title正常の場合' => [ 'title' => Str::random(50), 'content' => Str::random(1000), 'expected' => true ], 'titleがnullの場合' => [ 'title' => null, 'content' => Str::random(1000), 'expected' => false ], 'titleが51文字の場合' => [ 'title' => Str::random(51), 'content' => Str::random(1000), 'expected' => false ], 'contentがnullの場合' => [ 'title' => Str::random(50), 'content' => null, 'expected' => false ], 'contentが1001文字の場合' => [ 'title' => Str::random(50), 'content' => Str::random(1001), 'expected' => false ], ]; } /** * * @dataProvider dataproviderPostdata * @test */ public function 掲示板に投稿処理($title ,$content , $expected) { $user = factory(User::class)->create(); $this->actingAs($user) ->get('/posts'); $response = $this->post('/posts' ,[ 'title' => $title, 'content' => $content, ]); if ($expected === true) { $response->assertSessionHasNoErrors(); } else { $response->assertSessionHasErrors(); } }
ユーザーはファクトリーでダミーユーザーを作成していますが、その部分は割愛しています。
dataProviderでテスト項目をまとめる
dataproviderPostdata()
というメソッドの中で、テストしたい投稿データをまとめて書いています。
title、contentは投稿のタイトル・内容とそのままですが、3つめのexpectedは投稿する項目ではなく、
テスト結果をifで分岐させる時に使用します。
例えば、バリデーションでタイトル・内容にnullを許容しないとして
'titleがnullの場合' => [ 'title' => null, 'content' => Str::random(1000), 'expected' => false ],
データプロバイダの中にこんなテスト項目を書いてみます。タイトルがnull。そしてexpected(期待値)はfalseになっています。
タイトルがnullであることによるバリデーション エラーが出ることを期待したテストです。期待しているのはfalseですが、これをどこで使うかというと
テストを実行している最後の部分です。
if ($expected === true) { $response->assertSessionHasNoErrors(); } else { $response->assertSessionHasErrors(); }
データプロバイダで用意したexpectedの内容が変数$expectedに渡っているので、
trueならアサーションはエラーなし
falseならエラーが出る
のように期待されるテスト結果それぞれで分岐が可能です。
テスト結果
これでテストを実行すると
vendor/bin/phpunit --testdox
うまくいったようです。
↑のテスト実行メソッドは –testdox というオプションをつけているので、スクショのようにテスト項目を表示してくれています。
こちらを参考にさせていただきました!ありがとうございます!
まとめ
とりあえず自分のためにだだっとまとめて書きましたが、読んでわかりにくいのでまたテストをちゃんと理解してゆく過程で書き直します。。