laravelでテストを実装しています。
factoryで作ったitemの詳細ページ移動したいのですが、404のエラーが返ってきてしまいます。
データベースはテスト用のものを作り使用しています。
解決したい事: レスポンスが200を返すようになる事です。
現状の理解: 下記記載の6の部分で値が取得出来ていないのが怪しいと見ています。しかし、RefreshDatabaseを外すと値は保存出来ている事を確認しました。
エラーコード、関連ファイル
error
11) Tests\Feature\ItemManagement::test_ログインしていなくても詳細ページに遷移出来る 2Expected status code 200 but received 404. 3Failed asserting that 200 is identical to 404. 4 5$responseを確認 6#message: "No query results for model [App\Item] 11",
<?php namespace Tests\Feature; use App\Item; use App\User; use Illuminate\Foundation\Testing\RefreshDatabase; use Tests\TestCase; class ItemManagement extends TestCase { use RefreshDatabase; public function setUp(): void { parent::setUp(); $this->user = factory(User::class)->create(); $this->item = factory(Item::class)->create(['user_id' => $this->user->id]); } public function test_ログインしていなくても詳細ページに遷移出来る() { // データベースに存在するか確認しています $this->assertDatabaseHas('users', ['id' => $this->user->id]); $this->assertDatabaseHas('items', ['id' => $this->item->id]); $response = $this->get(route('items.show', ['item' => $this->item->id])); $response->assertStatus(200); $response->assertDontSee('編集', '削除'); } }
databasephp
1変更点のみ 2 3'mysql_testing' => [ 4 'database' => 'test_AppName', 5],
phpunit
1変更点のみ 2 3<server name="DB_CONNECTION" value="mysql_testing"/> 4<server name="DB_DATABASE" value="test_AppName"/> 5<server name="DB_HOST" value="127.0.0.1"/>
factory
1<?php 2 3/** @var \Illuminate\Database\Eloquent\Factory $factory */ 4 5use App\Item; 6use App\User; 7use Faker\Generator as Faker; 8 9$factory->define(Item::class, function (Faker $faker) { 10 return [ 11 'user_id' => function() { 12 return factory(User::class)->create()->id; 13 }, 14 'title' => $faker->name, 15 'content' => $faker->text, 16 ]; 17});
env
1env.testing ファイルです。変更点のみ 2 3APP_ENV=test
web
1Route::resource('items', 'ItemController');
試した事、確認した事
0, php artisan route:listでパスの確認。 -> 一致。
1, 普通に詳細ページにアクセス出来るか? -> 出来る。
2, testデータベース作り直し
3, php artisan config:clear
4, ちゃんとenv.testingを見てくれているか確認。下記のコード。 -> 見てくれてそう。
dd(env('APP_ENV'), env('DB_HOST'), env('DB_DATABASE'), env('DB_CONNECTION')); parent::setUp(); ^ "testing" ^ "127.0.0.1" ^ "test_AppName" ^ "mysql_testing"
5, RefreshDatabaseトレイト外したらデータベースに値は保存できてるか? -> 保存されてる。
6, 処理をeval(\Psy\sh());で止めて値を取得出来るか確認。 -> 取れない。
>>> $items = Item::get() => Illuminate\Database\Eloquent\Collection {#1538} >>> $items->count() => 0
7, 他のアプリで試してみる。 -> 同じコードで通りました。6の部分では値も取得できました。
上記から
$this->assertDatabaseHasでも直前で値がある事は確認出来ているのですが、なぜかアクセスする時には404になってしまいます。
他のアプリで確認したところ違いがあったのは6,7番目の部分でした。
上記を確認しましたが解決する事が出来ず、仮説が尽きてしました。
どなたかお分かりになる方、確認した方が良いところの心当たりがある方、是非知恵を貸していただきたいです。
よろしくお願いいたします。
PHP 7.4.8
Laravel 7.x
回答1件
あなたの回答
tips
プレビュー