тест syncRoles с разрешением spatie / laravel-sable assertTrue - PullRequest
0 голосов
/ 12 июня 2019

Мой тест создает Account с двумя User с, один из которых является 'admin' Role, который может предоставлять привилегии другим User с учетной записи, а другой - обычным User без назначенных Role с.

// AccountUsersTest.php
public function superusers_can_promote_users()
{
    $account = AccountFactory::withUsers(1)->create();
    $superuser = $account->superUser;
    $user = $account->regUsers->first();

    $this->actingAs($superuser)
        ->post($user->path(), ['role' => 'manager']);
    $this->assertTrue($user->hasRole('manager')); // <-- passes assertion

    $this->actingAs($superuser)
        ->post($user->path(), ['role' => 'user']);
    $this->assertTrue($user->hasRole('user')); // <-- fails assertion
}

// routes/web.php
Route::post('/account/users/{user}', 'AccountUsersController@update')->name('account.users.update');

// AccountUsersController.php
public function update(Request $request, User $user)
{
    $this->authorize('manageAccountUsers', $user->account);
    if ($role = request('role'))
    {
        $user->updateRole($role);
    }
    return redirect($user->path());
}

// User.php
public function updateRole($role)
{
    $this->syncRoles($role);
    var_dump($this->hasRole('user')); // <-- during the test, returns FALSE then TRUE (as expected)
}
  • Role с правильно добавляются в базу данных перед каждым тестом.
  • AccountFactory в тесте моделируется по модели класса Фабрика используется в серии "Birdboard" Laracasts TDD, которая используется так много других тестов, которые я не думаю, является проблемой.
  • $user->path() возвращает строку, содержащую URL-адрес конечной точки.
  • Авторизация проходит каждый раз, когда контроллер update метод называется.

Почему второе утверждение не выполняется?

...