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

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

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

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHPUnit

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

バリデーション

Validationとは特定の入力データが、求められた条件に当てまっているかをチェックするために使われます。

テスト駆動開発

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

Laravel 5

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

Q&A

解決済

1回答

1014閲覧

Laravel5.6 テストコード バリデーションが通らない問題 PHPunit

masateru2

総合スコア39

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHPUnit

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

バリデーション

Validationとは特定の入力データが、求められた条件に当てまっているかをチェックするために使われます。

テスト駆動開発

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

Laravel 5

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

0グッド

0クリップ

投稿2018/08/24 07:12

編集2018/08/24 07:35

発生している問題

現在テストコードを作成しているのですが、バリデーションのrules()のバリデーション内容にそって作っているのですが、テスト結果が思っているものとそぐわないのです。
falseは通っているのですが、trueが全て弾かれます

追記

いろいろ触って見てみるともしかしたら原因がrequiredにあるのでは無いかと思いました。
一旦一つのルール以外requiredを外してテストしてみるとrequiredが付いているコードのテストのみが成功して、他のコードは全て失敗してしまったので、テストコードは1行ずつ、バリデーションのルールの方は全て呼び出されているからルールにあっていないということで、エラーになってしまう可能性が出てきました。

該当のソースコード

//バリデーションルール等記載ファイル <?php namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; class ArticleCreateFormRequest extends FormRequest { /** * Determine if the user is authorized to make this request. * * @return bool */ public function authorize() { return true; } /** * Get the validation rules that apply to the request. * * @return array */ public function rules() { return [ 'articleTitle' => 'required|string|max:255', 'articleDescription' => 'required|string|max:255', 'postDate' => 'required|date', ]; }                   ~略~
//テストコード本体 <?php namespace Tests\Unit; use Tests\TestCase; use Illuminate\Foundation\Testing\WithFaker; use Illuminate\Foundation\Testing\DatabaseTransactions; use Illuminate\Http\UploadedFile; use Illuminate\Support\Facades\Storage; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Validator; use App\Article; use App\Http\Requests\ArticleCreateFormRequest; use Tests\Unit\UserLoginTest; use Carbon\Carbon; use Auth; use Faker\Generator as Faker; class ArticleTest extends TestCase { use DatabaseTransactions; /** * @dataProvider dataProviderNewArticle * @group exa */ public function testExample($dataList, $expect) { $request = new ArticleCreateFormRequest(); //フォームリクエストで定義したルールを取得 $rules = $request->rules(); //Validatorファサードでバリデーターのインスタンスを取得、その際に入力情報とバリデーションルールを引数で渡す $validator = Validator::make($dataList, $rules); //入力情報がバリデーショルールを満たしている場合はtrue、満たしていな場合はfalseが返る $result = $validator->passes(); //期待値($expect)と結果($result)を比較 $this->assertEquals($expect, $result); } //dataProvider(今回のテストコード) public function dataProviderNewArticle(){ $this->createApplication(); $faker = \Faker\Factory::create(); return[ [['articleTitle' => $faker->sentence()], true], [['articleTitle' => ''], false], [['articleTitle' => str_repeat('a', 256)] , false], [['articleDescription' => $faker->sentence()], true], [['articleDescription' => ''], false], [['articleDescription' => str_repeat('a', 256)] , false], [['postDate' => $faker->date()], true], [['postDate' => ''], false], [['postDate' => str_repeat('a', 256)] , false], ]; } }

試したこと

Requestファイル側のrules()の中身を一つにして実行してみるとうまく通った

<?php namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; class ArticleCreateFormRequest extends FormRequest { /** * Determine if the user is authorized to make this request. * * @return bool */ public function authorize() { return true; } /** * Get the validation rules that apply to the request. * * @return array */ public function rules() { return [        //変更点 'articleTitle' => 'required|string|max:255', ]; }                   ~略~

こちらのコードを回してみると無事テストに通った

<?php namespace Tests\Unit; use Tests\TestCase; use Illuminate\Foundation\Testing\WithFaker; use Illuminate\Foundation\Testing\DatabaseTransactions; use Illuminate\Http\UploadedFile; use Illuminate\Support\Facades\Storage; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Validator; use App\Article; use App\Http\Requests\ArticleCreateFormRequest; use Tests\Unit\UserLoginTest; use Carbon\Carbon; use Auth; use Faker\Generator as Faker; class ArticleTest extends TestCase { use DatabaseTransactions; /** * @dataProvider dataProviderNewArticle * @group exa */ public function testExample($dataList, $expect) { $request = new ArticleCreateFormRequest(); //フォームリクエストで定義したルールを取得 $rules = $request->rules(); //Validatorファサードでバリデーターのインスタンスを取得、その際に入力情報とバリデーションルールを引数で渡す $validator = Validator::make($dataList, $rules); //入力情報がバリデーショルールを満たしている場合はtrue、満たしていな場合はfalseが返る $result = $validator->passes(); //期待値($expect)と結果($result)を比較 $this->assertEquals($expect, $result); } //dataProvider(今回のテストコード) public function dataProviderNewArticle(){ $this->createApplication(); $faker = \Faker\Factory::create(); return[        //変更点 [['articleTitle' => $faker->sentence()], true], [['articleTitle' => ''], false], [['articleTitle' => str_repeat('a', 256)] , false], ]; } }

参考サイト

https://qiita.com/n_mogi/items/57a946205df2a69889c2

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

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

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

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

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

guest

回答1

0

自己解決

やはりdataProviderの方が1行ずつデータを渡されていたので、そちらの書き方を変更してテストを通すことができました。
頭の中で完全に正常処理と異常処理が同時に行えると思っていたのが、今回のミスを起こしたと思います。

変更前

public function dataProviderNewArticle(){ $this->createApplication(); $faker = \Faker\Factory::create(); return[ [['articleTitle' => $faker->sentence()], true], [['articleTitle' => ''], false], [['articleTitle' => str_repeat('a', 256)] , false], [['articleDescription' => $faker->sentence()], true], [['articleDescription' => ''], false], [['articleDescription' => str_repeat('a', 256)] , false], [['postDate' => $faker->date()], true], [['postDate' => ''], false], [['postDate' => str_repeat('a', 256)] , false], ]; }

変更後

public function dataProviderNewArticle(){ $this->createApplication(); $faker = \Faker\Factory::create(); return[ [['articleTitle' => $faker->sentence(), 'articleDescription' => $faker->sentence(), 'postDate' => $faker->date(), ]; }

投稿2018/08/24 08:35

masateru2

総合スコア39

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問