バーテンダーエンジニア

元フレアバーテンダーからエンジニアに転職。未経験からのエンジニア転職経験談・実務で感じたこと・個人開発で学んだ内容・日常話などマイペースに発信していきます。仕事ではphp、Laravel、Vue.js、Angular辺りを触ってます。趣味は筋トレ!!ソムリエの資格も持ってます^^

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'
        ];
    }

上記のように修正を加える事でクリア!!
単純な事でしたが結構時間をもっていかれました。。