Я хотел бы написать тест, если у пользователя есть доступ к определенным маршрутам.
Что-то вроде администратора может видеть всех пользователей или администратор может видеть детали пользователей.
class UsersController extends Controller
{
public function index()
{
$users = User::all();
return view('users.index', compact('users'));
}
public function show(User $user)
{
return view('users.show', compact('user'));
}
}
Это мой упрощенный пользовательский контроллер.Прямо сейчас я защищаю его с помощью промежуточного программного обеспечения в web.php
Route::group(['middleware' => ['permission:view users']], function() {
Route::get('/users', 'UsersController@index');
});
Route::group(['middleware' => ['permission:show user']], function() {
Route::get('/users/{user}', 'UsersController@show');
});
Позже я хотел бы реорганизовать его и использовать вместо этого Middleware для этого действия.
Я использую SpatieПакет разрешений для авторизации пользователей.
Это мой тест:
class UserManagementTest extends TestCase
{
use RefreshDatabase, WithFaker;
public function setUp(): void
{
// first include all the normal setUp operations
parent::setUp();
// re-register all the roles and permissions
$this->app->make(\Spatie\Permission\PermissionRegistrar::class)->registerPermissions();
}
/** @test */
public function only_authorized_users_can_see_user_details_site()
{
// $this->withoutExceptionHandling();
$admin = factory(User::class)->create();
$user = factory(User::class)->create();
$role = factory(Role::class)->create();
$permission = factory(Permission::class)->create([
'name' => 'show user'
]);
$role->givePermissionTo($permission);
$admin->assignRole($role);
$this->actingAs($admin)->get("/users/{$user->id}")->assertOk();
$this->actingAs($user)->get("/users/{$user->id}")->assertStatus(403);
}
}
Это мой тест.Я создаю администратора, а также пользователя.Администратор имеет роль «администратор» и получает разрешение «показать пользователя».После этого я утверждаю статус администратора и пользователя.
К сожалению, в этот момент я получаю $this->actingAs($admin)->get("/users/{$user->id}")->assertOk();
ошибку.
Tests \ Feature \ UserManagementTest ::only_authorized_users_can_see_user_details_site Код состояния ответа [500] не соответствует ожидаемому коду 200.Не удалось утверждать, что false - это истина.
Когда я запускаю тест с методомlessExceptionHandling (), я получаю эту ошибку:
Tests \ Feature \ UserManagementTest ::only_authorized_users_can_see_user_details_site ErrorException: попытка получить свойство 'name' не-объекта (View: /home/vagrant/code/boilerplate/resources/views/users/show.blade.php) .... ErrorException: попытка получить свойство name'необъекта ...
Очевидно, он не может найти свойство $user->name
.
Есть ли лучший способ проверить авторизацию для маршрутов?