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

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

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

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

PHPUnit

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

Q&A

0回答

605閲覧

LaravelのassertSessionHasErrorsを実行できない

hx_kei

総合スコア10

Laravel

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

PHPUnit

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

0グッド

0クリップ

投稿2020/08/19 12:50

環境
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:

  1. 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使い方をご教授頂ければ大変ありがたいです。

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問