Задать вопрос
@yarnstart
Превозмогание и React

Как избежать дублирования кода в тесте phpunit?

Создал тест, три метода, тестирующий регистрацию, логин, логаут (REST API, Laravel Passport), сразу бросается в глаза то, что приходится половину кода из testLogin копипастить в testLogout, т.к. иначе база на момент testLogout не будет содержать юзера (передача его через @depends не имеет смысла), есть идея вынести код создания и логина юзера в приватный метод и использовать его в testLogin и testLogout, не знаю насколько это правильно.
Нагугли о setUp, но он выполняется перед каждым методом, а перед testRegister этот код не будет нужен.

Примерный код:
код

class AuthTest extends TestCase
{
    use DatabaseMigrations;

    public function testRegister()
    {
        $user = factory(User::class)->make(['password' => 'password123']);

        $route = route('register');
        $payload = [
            'name' => $user->name,
            'email' => $user->email,
            'password' => $user->password,
            'password_confirmation' => $user->password,
        ];

        $this->post($route, $payload)->assertStatus(200);
    }

    public function testLogin()
    {
        \Artisan::call('passport:install');
        $password = '1234567890';
        $user = factory(User::class)->create(['password' => bcrypt($password)]);

        $route = route('login');
        $payload = [
            'email' => $user->email,
            'password' => $password,
        ];

        $response = $this->post($route, $payload);

        $response
            ->assertStatus(200)
            ->assertJsonStructure([
                'data' => [
                    'token_type',
                    'token',
                    'expires_at',
                ],
            ]);

        $responseToken = $response->json()['data']['token'];
        $authedUser = Auth::user()->withAccessToken($responseToken);
        $this->assertEquals($user->id, $authedUser->id);
    }

    public function testLogout()
    {
        \Artisan::call('passport:install');
        $password = '1234567890';
        $user = factory(User::class)->create(['password' => bcrypt($password)]);

        $route = route('login');
        $payload = [
            'email' => $user->email,
            'password' => $password,
        ];

        $response = $this->post($route, $payload);

        $route = route('logout');
        $this->post($route /* LOGOUT */);
    }
}

  • Вопрос задан
  • 120 просмотров
Подписаться 2 Средний 2 комментария
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы