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

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

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

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

PHP

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

PHPUnit

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

Q&A

0回答

746閲覧

web上での編集はできるが、testをすると値が無いですよというエラーが表示されてしまいます。Session has unexpected errors

tenlife

総合スコア70

Laravel

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

PHP

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

PHPUnit

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

0グッド

0クリップ

投稿2020/12/01 22:47

編集2022/01/12 10:55

laravelでitem編集機能のテストを実行しています。

現状はテストを実行すると値が入っていないと認識するエラーが表示されてしまいます。

Session has unexpected errors: [ "タイトルを入力してください" ] Failed asserting that true is false.

予想していること
編集ページでタイトルの情報が送られず、コントローラーでvalidateのrequiredが効いてしまっている。なので編集ページが1番怪しい?と仮説を立てています。

各ファイル

ItemTest

1public function test_Userがログインしているかつ、自分の投稿であれば編集出来る() 2 { 3 $response = $this->actingAs($this->user); 4 $response = $this->get(route('items.edit', ['item' => $this->item->id])); 5 $response->assertStatus(200); 6 7 $itemdata = [ 8 // 'title' => '編集成功', 9 'content' => 'ご飯食べる', 10 ]; 11 12 // updateアクションまでのパスを作成 13 $update_url = route('items.update', ['item' => $this->item->id]); 14 // $this->putで編集処理 15 $response = $this->from(route('items.edit', ['item' => $this->item->id]))->put($update_url, $itemdata); 16 // エラーメッセージがないこと 17 $response->assertSessionHasNoErrors(); 18 }

Request

1<?php 2 3namespace App\Http\Requests; 4 5use Illuminate\Foundation\Http\FormRequest; 6 7class CreateItem extends FormRequest 8{ 9 public function rules() 10 { 11 return [ 12 'title' => 'required|max:30', 13 'content' => 'required|max:300' 14 ]; 15 } 16 17 public function attributes() 18 { 19 return [ 20 'title' => 'タイトル', 21 'content' => '内容' 22 ]; 23 } 24 25 public function messages() 26 { 27 return [ 28 'title.required' => 'タイトルを入力してください', 29 'title.max' => 'タイトルは30文字以内で入力してください', 30 'content.required' => '内容を入力してください', 31 'content.max' => '内容は300文字以内で入力してください', 32 ]; 33 } 34} 35

controller

1use App\Http\Requests\CreateItem; 2 3public function update(CreateItem $request, $item) 4{ 5   $item->title = $request->title; 6 $item->content = $request->content; 7 $item->save(); 8 return redirect()->route('items.show', ['item' => $item->id])->with('item', $item); 9}

view

1<form method="POST" action="{{ route('items.update', ['item' => $item->id]) }}"> 2 @csrf 3 @method('PUT') 4 <input id="title" type="text" class="form-control @error('title') is-invalid @enderror" name="title" value="{{ $item->title }}" autocomplete="title" autofocus> 5 6 <textarea id="content" type="text" class="form-control @error('content') is-invalid @enderror" name="content" autocomplete="content" autofocus>{{ $item->content }}</textarea> 7</form>

確認したこと

1, 普通に編集処理がweb上で出来るか? -> o
2, php artisan config:clearの実行 -> 変わらず
3, view側の記載変更(old()メソッドを使う)

value="{{ $item->title }}" ↓ value="{{ old('title' , $item->title) ?? $item->title }}" value="{{ old('title' , $item->title)}}" value="{{ old('title') ?? $item->title }}"

4, バリデーションの記載チェック

上記の確認をしましたが、エラーは変わらずでした。。

同じ要領でtextareaのcontentでも試してみましたが、変わらず同じエラーが出てしまいます。

viewあたりが怪しいのかと考えているのですが、原因が特定できませんでした。(普通の編集の場合は送られているのに。。なんでなんだろう?)という感じです。

どなたかお分かりになる方居ましたら、教えていただきたいです。

よろしくお願い致します。

追記

コントローラーのcreateItemをRequestに変更してみました。
testの時には元々のitemの情報(title部分)が飛んできていないため、タイトルを入力してくださいというエラーが表示されました。

testでputする際に元のitemの情報も飛ばしてあげないといけないということでしょうか?

Web上で試した時 $request->all() => [ "_token" => "dkPGbTzat4doWf6LEAujlrm2lZNaZg1KRScoYGVw", "title" => "梗ききましまいました。もうこ。", "content" => "砲丸てっぽうだ。お。" ] Testで試した時 >>> $request->all() => [ "content" => "これが出来たらご飯食べる", ] Session has unexpected errors: [ "タイトルを入力してください" ] Failed asserting that true is false.

追記2

web

1Route::resource('items', 'ItemController');
GET|HEAD | items/{item}/edit | items.edit | App\Http\Controllers\ItemController@edit | web PUT|PATCH | items/{item} | items.update | App\Http\Controllers\ItemController@update | web POST | items | items.store | App\Http\Controllers\ItemController@store | web

laravel 7.x
php 7.4.8

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

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

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

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

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

FKM

2020/12/02 00:19 編集

viewからのpostで飛ばしたいコントローラ内のメソッドに飛んでいるか、echoなどで追跡してみてください。Requestクラスのtitle要求エラーが出ているってことは、希望の場所にデータが転送されていませんね。
tenlife

2020/12/02 21:20

調べた結果コントローラー内のアクションに飛んでいそうです。CreateItemをRequestに書き換えて確認しました。 編集で追記しましたが、送信しているデータが怪しいです。
FKM

2020/12/02 23:57

ルーティングはどうなっていますか?
FKM

2020/12/03 02:05 編集

フォームのアクションでupdateに飛ばしているようですが、肝心のupdateメソッドの中身、特にpostでの受け渡し部分はどうなっていますか?
tenlife

2020/12/03 02:14

controllerのupdateアクションに記載を追加しました。 <- postでの受け渡し部分 -> こちらがどの部分を指すのか教えて頂きたいです。
FKM

2020/12/03 02:27 編集

updateメソッドの引数の指定がCreateItemになっていますが、これはRequestでないのはなにか理由があるのですか?
tenlife

2020/12/03 04:06

バリデーションをかけています。 Requestとしてコードも記載していますので参考にしてください
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問