我想编写一个测试,检查用户是否可以访问特定的路由。
类似管理员的角色可以看到所有用户,或者管理员可以看到用户的详细信息。
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');
});
稍后我想对其进行重构,并使用Policy而不是Middleware来执行此操作。
我正在使用Spatie Permissions软件包对用户进行授权。
这是我的测试
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为真。
当我使用noExceptionHandling()方法运行测试时,出现此错误:
Tests \ Feature \ UserManagementTest :: only_authorized_users_can_see_user_details_site ErrorException:尝试获取非对象的属性“名称”(视图: /home/vagrant/code/boilerplate/resources/views/users/show.blade.php) .... ErrorException:试图获取非对象的属性'name'...
很显然,它找不到$user->name
的属性。
是否有更好的方法来测试路由授权?