Target class [url] does not exist. エラーに悩まされた話
はじめに
エンジニア転職を目指してRailsで作成したポートフォリオには自動テストを組み込んでいましたが、現在メインで使用しているLaravelでは、案件として自動テストを導入した経験がありませんでしたので、今回自作アプリに導入を試みてみました。
意気揚々とテストコードをググりながら書き出したのですが、すぐに壁にぶち当たりました。
発生したエラー
ユーザーの新規登録についてのテストコードを記載し実行すると下記のようなエラーが発生。
<?php // ユーザー新規作成のテストコード namespace Tests\Feature; use App\Models\User; use Illuminate\Foundation\Testing\RefreshDatabase; use Illuminate\Foundation\Testing\WithFaker; use Tests\TestCase; class UserRegisterTest extends TestCase { use RefreshDatabase; public function setUp(): void { $this->params = [ 'name' => 'test_user', 'email' => 'test@example.com', 'password' => 'password', 'password_confirmation' => 'password' ]; } /** * @test */ public function 新規ユーザーを作成() { $response = $this->json('POST', route('register'), $this->params); $user = User::first(); $this->assertEquals($this->params['name'], $user->name); $response->assertStatus(201); $response->assertJson([ 'name' => $user->name ]); } }
// 発生したエラー lluminate\Contracts\Container\BindingResolutionException: Target class [url] does not exist.
エラー原因の調査
Target class [url] does not exist.エラーなので、routeの定義が上手く行ってないのかと考えphp artisan route:listコマンドで調査も問題なし。
authコマンドでファイル等新規で作成したので、composer dump-autoloadが必要なのかと思い実行も変更なし...。
ここまでの時点でテストコード側に問題があると考えました。
エラー原因の特定
テストコードでpostで投げるデータをsetUp()の中で定義しています。そこに問題がありました。各テストメソッドの実行前に呼ばれるメソッドなのですが、 このsetUp()を利用する際は、関数の一番上にparent::setUp()を記述する必要があります。
public function setUp(): void { parent::setUp(); ←追記 $this->params = [ 'name' => 'test_user', 'email' => 'test@example.com', 'password' => 'password', 'password_confirmation' => 'password' ]; }
上記のように修正を加える事でクリア!!
単純な事でしたが結構時間をもっていかれました。。