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
あなたの回答
tips
プレビュー