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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Laravel

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

PHPUnit

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

XAMPP

XAMPP(ザンプ)は、ウェブアプリケーションの実行に必要なフリーソフトウェアをパッケージングしたApacheディストリビューションです。 XAMPPひとつインストールするだけで、Apache、MySQL、PHP、Perlなどのソフトウェアと、 phpMyAdminなどの管理ツール、SQLiteなどのソフトウェアやライブラリモジュールなどを利用することが可能です。

Q&A

0回答

2240閲覧

LaravelのテストコードでSession is missing expected key エラーになる

chitan148

総合スコア4

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Laravel

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

PHPUnit

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

XAMPP

XAMPP(ザンプ)は、ウェブアプリケーションの実行に必要なフリーソフトウェアをパッケージングしたApacheディストリビューションです。 XAMPPひとつインストールするだけで、Apache、MySQL、PHP、Perlなどのソフトウェアと、 phpMyAdminなどの管理ツール、SQLiteなどのソフトウェアやライブラリモジュールなどを利用することが可能です。

1グッド

0クリップ

投稿2020/08/05 05:24

環境

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:

  1. 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

  1. 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) と出ます。

解決したくて色々とやってみるのですが、初心者すぎてやったことの結果の解釈もできないという事態に陥っています。
申し訳ありません。どうぞよろしくお願い致します。

ginnamiegg👍を押しています

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問