環境
PHP 7.2.5
Laravel 7.24
mysql 5.7.29
Dockerにapacheサーバーを入れて、その環境上でLaravel環境構築
実現したいこと
https://teratail.com/questions/200689
上記の質問とやっていることは同じです。
https://www.hypertextcandy.com/laravel-tutorial-create-task/
に記載の、テストコードを記載したTaskTest.phpとほぼ同じ内容でRecordTest.phpを作成。
意図的にエラーを起こすような値をpostした時、想定したエラーメッセージが返ってきて、docker上のコマンドラインでdate_should_be_date date_should_not_be_pastにチェックマークが付くこと
テストコード
RecordTest
1namespace Tests\Feature; 2 3use Illuminate\Foundation\Testing\RefreshDatabase; 4use Tests\TestCase; 5use Carbon\Carbon; 6use App\Http\Requests\DateRecord; 7 8<中略> 9 10 use RefreshDatabase; 11 12 public function setUp() :void 13 { 14 parent::setUp(); 15 16 // テストケース実行前にフォルダデータを作成する 17 $this->seed('GorecordsTableSeeder'); 18 } 19 20 /** 21 * 期限日が過去日付の場合はバリデーションエラー 22 * @test 23 */ 24 public function date_should_be_date() 25 { 26 $response = $this->post('/record', [ 27 'date' => 123, // 不正なデータ(数値) 28 ]); 29 30 // dd($response); 31 32 $response->assertSessionHasErrors([ 33 'date' => '期限日 には日付を入力してください。', 34 ]);
コントローラー
RecordController
1namespace App\Http\Controllers; 2 3use Illuminate\Http\Request; 4use App\Http\Requests\DateRecord; 5use App\Gorecord; 6use App\Leaverecord; 7use Carbon\Carbon; 8 9<中略> 10 11 public function date(DateRecord $request) 12 { 13 // 指定された日付の出勤記録を全て取得する 14 $gorecords = Gorecord::whereDate('go_date',$request->date)->get(); 15 16 // 指定された日付の退勤記録を全て取得する 17 // $leaverecords = Leaverecord::whereDate('leave_date',$request->date)->get(); 18 19 return view('situation',[ 20 'date' => $request->date, 21 'gorecords' => $gorecords, 22 'leaverecords' => $leaverecords, 23 ]); 24 }
requestルール
DataRecord
1namespace App\Http\Requests; 2 3use Illuminate\Foundation\Http\FormRequest; 4 5class DateRecord extends FormRequest 6{ 7<中略> 8 public function authorize() 9 { 10 return true; 11 } 12 13 /** 14 * Get the validation rules that apply to the request. 15 * 16 * @return array 17 */ 18 public function rules() 19 { 20 return [ 21 'date' => 'required|date|after_or_equal:today', 22 ]; 23 }
ルーティング
web
1use Illuminate\Support\Facades\Route; 2 3<中略> 4 5Auth::routes(); 6 7Route::get('/', 'IndexController@index')->name('index'); 8 9Route::post('/record/post', 'RecordController@post'); 10 11Route::get('/record', 'RecordController@show')->name('record'); 12 13Route::post('/record', 'RecordController@date');
テーブル設計
Gorecord
1 public function up() 2 { 3 Schema::create('gorecords', function (Blueprint $table) { 4 $table->increments('id'); 5 $table->string('user_name'); 6 $table->date('go_date'); 7 $table->time('go_time'); 8 $table->timestamps(); 9 10 // 外部キーを設定する 11 // $table->foreign('user_id')->references('id')->on('users'); 12 }); 13 14 15 }
現状
上記を記述のうえ、
./vendor/bin/phpunit ./tests/Feature/TaskTest.php
を実行すると、エラー発生
エラー内容
There were 2 failures:
- Tests\Feature\TaskTest::due_date_should_be_date
✘ Date should be date
┐
├ Failed asserting that an array contains '期限日 には日付を入力してください。'.
│
╵ /var/www/main_attendance/vendor/laravel/framework/src/Illuminate/Testing/TestResponse.php:1059
╵ /var/www/main_attendance/tests/Feature/RecordTest.php:47
エラー解消のため試したこと
・ルールが機能しているか確かめるため、dateの誤情報をフォームで送信したところ、エラーが発生し、リダイレクトされました。ルールは働いているため、テストコードの記述にミスがあると考えています。
・//指定された日付の退勤記録を全て取得する
$leaverecords = Leaverecord::whereDate('leave_date',$request->date)->get();
setUpで2つのシーダーを作成する方法がわからなかったため、上記一式の$leaverecordsの取得を一時的に削除したが、同様のエラーが発生した。
知りたいこと
・setUp(またはそれ以外)で複数シーダーを作成する方法
・dd($response)で出たエラー結果の見方
・テストコードの流れ
考えられる問題点
・$leaverecordsがないため、viewに返したときにエラーが発生するので、正しくテストできない。
・テストコードはsetUpでデータ作成→date_should_be_date()の/recordで実装されているrequestにデータが入る→
1.requestルールでの不正データはリダイレクトされない?
2.1からそのまま進んでデータを挿入→responseにデータを返す→Leaverecord::whereDateでデータは返すので、エラーが発生しない。
ルールの時点でエラーを返されるわけではないのでしょうか?
テストコードの流れとsetUp使い方をご教授頂ければ大変ありがたいです。
あなたの回答
tips
プレビュー