テストを勉強中のものです。
現在crudのdeleteのテストを実装しているのですが、実行するとそもそも削除するモデルが無いよと言う感じでエラーが表示されます。(自分の見解です)
解決したい事: deleteやshowのタイミングで404が表示されないようにしたいです。
現状: 実行すると404やNo query resultsが返ってきますが、$this->itemは取得できます。
error
1exception: Illuminate\Database\Eloquent\ModelNotFoundException {#3859 2#message: "No query results for model [App\Item] 9", 3 4上記$responseの中身 5 61) Tests\Feature\ItemManagement::test_ログインしているかつ、自分の投稿であれば削除出来る 7Expected status code 302 but received 404. 8Failed asserting that 302 is identical to 404. 9 10以下確認 11https://readouble.com/laravel/7.x/ja/eloquent.html
ItemManagement
1<?php 2 3namespace Tests\Feature; 4 5use App\Item; 6use App\User; 7use Illuminate\Foundation\Testing\RefreshDatabase; 8use Tests\TestCase; 9use Illuminate\Support\Facades\Auth; 10 11class ItemManagement extends TestCase 12{ 13 use RefreshDatabase; 14 15 public function setUp(): void 16 { 17 parent::setUp(); 18 $this->user = factory(User::class)->create(); 19 $this->item = factory(Item::class)->create(['user_id' => $this->user->id]); 20 } 21 22 public function test_ログインしているかつ、自分の投稿であれば削除出来る() 23 { 24 $this->actingAs($this->user); 25 26 $response = $this->delete(route('items.destroy', ['item' => $this->item->id])); 27 $response->assertStatus(302); 28 29 $response->assertRedirect('items'); 30 31 $this->assertDatabaseMissing('items', ['id' => $this->item->id]); 32 }
route
1Route::resource('items', 'ItemController');
試したこと、確認したこと
1, 普通に削除処理が出来るか。
2, キャッシュ削除
3, テスト用データベースのリセット
4, 下記の書き換え2つ
$response = $this->delete(route('items.destroy', ['item' => $this->item->id])); 下記に変更 $response = $this->deleteJson(route('items.destroy', ['item' => $this->item->id])); とか $response = $this->delete('items/'.$this->item->id);
5, モデルがないならそもそもshowページも行けない?
404が返ってきているので、deleteと同じ状態でした。
ただし、$responseを確認するところで$this->itemを実行すると値は取得できていました。delete時も出来ました。
// アクセス出来るか? $response = $this->get(route('items.show', ['item' => $this->item->id])); $response->assertStatus(200); $resoponseの中身 exception: Illuminate\Database\Eloquent\ModelNotFoundException {#3886 #message: "No query results for model [App\Item] 8" エラー Expected status code 200 but received 404. Failed asserting that 200 is identical to 404.
6, 編集の際にeditには遷移できる?
こちらは全く問題なく通ります。
$response = $this->actingAs($this->user); $response = $this->get(route('items.edit', ['item' => $this->item->id])); $response->assertStatus(200);
上記から
現状としては、
- delete, showだとアクセスする為のモデルが存在しないと言われる。
- 返り値は404。$responseはNo query results for model [App\Item].
- だが、どちらも$this->itemを実行すると値は取得できる状態。($responseと同じタイミングで確認。)
$this->itemで取得出来るのに、なぜ404が返ってくるの?なんでeditはいけてshowがダメなのだろう?と言うところで止まってしまいました。
テストは初めて間もないので、足りない部分があるかもしれません。
どなたかお分かりになる方いましたら、知恵を貸して頂きたいです。
よろしくお願いいたします。
laravel7.x
PHP 7.4.8
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。