2016-05-28 3 views
3

Laravel версии 5.2Тестирование Несанкционированное ограничение пользователя в Laravel PHPUnit

В моем проекте, пользователи с role_id = 4 имеет роль администратора и может управлять пользователями.

Я определил следующие возможности в AuthServiceProvider:

public function boot(GateContract $gate) 
{ 
    $this->registerPolicies($gate); 

    $gate->define('can-manage-users', function ($user) 
    { 
     return $user->role_id == 4; 
    }); 
} 

Я использовал эту способность в методе __construct UserController следующим образом:

public function __construct() 
{ 
    $this->authorize('can-manage-users'); 
} 

В ExampleTest, я создал два тестов для проверки если работает определенная авторизация.

Первый тест для пользователя admin, у которого есть role_id = 4. Этот тест проходит.

public function testAdminCanManageUsers() 
{ 
    $user = Auth::loginUsingId(1); 
    $this->actingAs($user) 
     ->visit('users') 
     ->assertResponseOk(); 
} 

Второй тест для другого пользователя, который не имеет ROLE_ID = 4. Я попытался с состоянием ответа 401 и 403. Но испытание терпит неудачу:

public function testNonAdminCannotManageUsers() 
{ 
    $user = Auth::loginUsingId(4); 
    $this->actingAs($user) 
     ->visit('users') 
     ->assertResponseStatus(403); 
} 

Первые несколько строк сообщение об отказе приводится ниже:

Запрос на [http://localhost/users] не выполнен. Получен код состояния [403].

C: \ WAMP \ WWW \ Laravel \ блог \ поставщика \ Laravel \ Framework \ SRC \ Осветите \ Foundation \ Testing \ Обеспокоенность \ InteractsWithPages.php: 196 C: \ WAMP \ WWW \ Laravel \ блог \ поставщика \ laravel \ framework \ src \ Illuminate \ Foundation \ Testing \ Concerns \ InteractsWithPages.php: 80 C: \ wamp \ www \ laravel \ blog \ vendor \ laravel \ framework \ src \ Illuminate \ Foundation \ Testing \ Concerns \ InteractsWithPages.php : 61 C: \ WAMP \ WWW \ Laravel \ блог \ Тесты \ ExampleTest.php: 33

, вызванные исключением 'Осветите \ Auth \ Access \ AuthorizationException' с сообщением. Это действие является несанкционированным " в C: \ WAMP \ WWW \ Laravel \ блог \ поставщика \ Laravel \ Framework \ SRC \ Осветите \ Auth \ Access \ HandlesAuthorization.php: 28

Я также попытался использовать 'видеть' метод следующим образом :

public function testNonAdminCannotManageUsers() 
{ 
    $user = Auth::loginUsingId(4); 
    $this->actingAs($user) 
     ->visit('users') 
     ->see('This action is unauthorized.'); 
} 

Но это тоже не удается. Что я делаю не так? Как я могу пройти тест?

+0

Продвижение по этой проблеме? – naneri

ответ

4

Ошибка вызывает метод visit. Метод visit относится к признаку InteractsWithPages. Этот метод вызывает метод makeRequest, который, в свою очередь, вызывает метод assertPageLoaded. Этот метод получает код состояния, возвращаемый и если он получает код, отличный от 200, он ловит PHPUnitException и бросает HttpException с сообщением

«Запрос на [{$ Uri}] не удалось. Received код состояния [{ $ статус}] «.

Вот почему тест не удался с вышеуказанным сообщением.

Тест может быть успешно пройден с использованием метода get вместо метода visit. Например:

public function testNonAdminCannotManageUsers() 
{ 
    $user = App\User::where('role_id', '<>', 4)->first(); 

    $this->actingAs($user) 
     ->get('users') 
     ->assertResponseStatus(403); 
} 

Этот тест пройдет и подтвердит, что пользователь, не имеющий права администратора, не может получить доступ к URL-адресу.