環境
PHP 7.4.3
Laravel 6
XAMPP使用
windows10
コマンドラインはGitbash使用
実現したいこと
https://www.hypertextcandy.com/laravel-tutorial-create-task/
に記載の、テストコードを記載したTaskTest.phpを実行。
意図的にエラーを起こすような値をpostした時、想定したエラーメッセージが返ってきて、
Gitbash上で
due_date_should_be_date
due_date_should_not_be_past
にチェックマークが付くこと
●TaskTest.php
namespace Tests\Feature; use App\Http\Requests\CreateTask; use Carbon\Carbon; use Illuminate\Foundation\Testing\RefreshDatabase; use Illuminate\Foundation\Testing\WithFaker; use Tests\TestCase; class TaskTest extends TestCase { /** * A basic feature test example. * * @return void */ public function testExample() { $response = $this->get('/'); $response->assertStatus(200); } // テストケースごとにデータベースをリフレッシュしてマイグレーションを再実行する use RefreshDatabase; /** * 各テストメソッドの実行前に呼ばれる */ public function setUp():void { parent::setUp(); //テストケース実行前にフォルダデータを作成する $this->seed('FoldersTableSeeder'); } /** * 期限日が日付ではない場合はバリデーションエラー * @test */ public function due_date_should_be_date() { $response = $this->post('/folders/1/tasks/create', [ 'title' => 'Sampletask', 'due_date' => 123, // 不正なデータ(数値) ]); $response->assertSessionHasErrors([ 'due_date' => '期限日 には日付を入力してください。', ]); } /** * 期限日が過去日付の場合はバリデーションエラー * @test */ public function due_date_should_not_be_past() { $response = $this->post('/folders/1/tasks/create', [ 'title' => 'Sample task', 'due_date' => Carbon::yesterday()->format('Y/m/d'), // 不正なデータ(昨日の日付) ]); $response->assertSessionHasErrors([ 'due_date' => '期限日 には今日以降の日付を入力してください。', ]); } }
現状
上記を記述のうえ、
./vendor/bin/phpunit ./tests/Feature/TaskTest.php
を実行するとエラー発生。
エラー内容
There were 2 failures:
- Tests\Feature\TaskTest::due_date_should_be_date
Session is missing expected key [errors].
Failed asserting that false is true.
C:\Users\chi_s\Desktop\laravel\laraveltodo\vendor\laravel\framework\src\Illuminate\Testing\TestResponse.php:972
C:\Users\chi_s\Desktop\laravel\laraveltodo\vendor\laravel\framework\src\Illuminate\Testing\TestResponse.php:1047
C:\Users\chi_s\Desktop\laravel\laraveltodo\tests\Feature\TaskTest.php:50
- Tests\Feature\TaskTest::due_date_should_not_be_past
Session is missing expected key [errors].
Failed asserting that false is true.
C:\Users\chi_s\Desktop\laravel\laraveltodo\vendor\laravel\framework\src\Illuminate\Testing\TestResponse.php:972
C:\Users\chi_s\Desktop\laravel\laraveltodo\vendor\laravel\framework\src\Illuminate\Testing\TestResponse.php:1047
C:\Users\chi_s\Desktop\laravel\laraveltodo\tests\Feature\TaskTest.php:65
読み込んでいるCreateTask.phpの関数名が間違っていた為、修正後に上記のエラーがでるようになりました。
修正前は、同じ条件で以下のエラーがでていました。
エラー内容(CreateTask.php修正前)
Due date should be date
Failed asserting that an array contains '期限日 には日付を入力してください。'.
C:\Users\chi_s\Desktop\laravel\laraveltodo\vendor\laravel\framework\src\Illuminate\Testing\TestResponse.php:1057
C:\Users\chi_s\Desktop\laravel\laraveltodo\tests/Feature/TaskTest.php:51
Due date should not be past
Failed asserting that an array contains '期限日 には今日以降の日付を入力してください。'.
C:\Users\chi_s\Desktop\laravel\laraveltodo\vendor\laravel\framework\src\Illuminate\Testing\TestResponse.php:1057
C:\Users\chi_s\Desktop\laravel\laraveltodo\tests/Feature/TaskTest.php:65
●修正したCreateTask.php( attirbutes → attributes )
namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; class CreateTask 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 [ 'title' => 'required|max:100', 'due_date' => 'required|date|after_or_equal:today', ]; } public function attributes(){ return [ 'title' => 'タイトル', 'due_date' => '期限日', ]; } public function messages(){ return[ 'due_date.after_or_equal' => ':attribute には今日以降の日付を入力してください。', ]; } }
エラー解消のため試したこと
●dd($response);を置いてみた
$response->assertSessionHasErrors()の前に置いてみて、大量のコードが出てきたのですけど、全く読み解けませんでした。
●Log::info()を置いてみた
TaskTest.phpの中で、use Log して、置いてみたのですが、laravel.logには何も吐き出されませんでした。
●972 と 1047 を見てみた
エラーログに出てくるTestRespone.phpを開いてみた所、
public function assertSessionHas($key, $value = null){
public function assertSessionHasErrors($keys = [], $format = null, $errorBag = 'default'){
というメソッドがあったのですが、どこで呼び出されているのかわかり切れず、なぜ$valueがnullなのか不明
●エラー文Session is missing expected key [errors].でググってみた
https://laracasts.com/discuss/channels/testing/session-is-missing-expected-key-errors-failed-asserting-that-false-is-true?page=1
この記事を発見し、日本語に翻訳して読んでみましたが、解決策は出ていないみたいでした。
●テストコードや、assertSessionHas()などにブレイクポイントを置いてデバックしてみる
Xdebugを実行したところ、vendor\SymfonyS\console\input\ArrayInput.phpで、addLongOption()というメソッドで例外が出たところから始まりました。
●もう一度、配列のエラーを発生させてみる( attributes → attirbutes に逆修正)
配列エラーは再現できませんでした。Session is missing expected key [errors].が出ます。
備考
●実現したいこと欄に記載したチュートリアルサイトでは、SQLiteを使っていますが、自分はXAMPPなのでMysqlを使っています。
●function setUp()の後に、:voidとしているのは、チュートリアルサイトでは5.7で自分は6なので:voidが必要になったらしく、記載しないとまた違うエラーがでます。チュートリアルサイトのコメント欄にも、必要になっているとの記載がありました。
●use RefreshDatabase;以下をコメントアウトし、vendor/bin/phpunit を Gitbashに打って実行すると、
ok(3 tests, 3 assertions) と出ます。
解決したくて色々とやってみるのですが、初心者すぎてやったことの結果の解釈もできないという事態に陥っています。
申し訳ありません。どうぞよろしくお願い致します。
あなたの回答
tips
プレビュー