如何使用Laravel和Spatie Permissions软件包测试授权用户是否有权执行某项操作

时间:2019-05-17 08:38:51

标签: php laravel permissions spatie

我想编写一个测试,检查用户是否可以访问特定的路由。

类似管理员的角色可以看到所有用户,或者管理员可以看到用户的详细信息。

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的属性。

是否有更好的方法来测试路由授权?

0 个答案:

没有答案