発生している問題
現在テストコードを作成しているのですが、バリデーションの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], ]; } }
参考サイト
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。