phpuint Illuminate\Auth\Access\AuthorizationException: это действие неавторизовано

У меня есть метод index в контроллере, подобный этому

 public function index()
{
     $this->authorize('index', Contact::class);
  ....
}

и метод index в ContactPolicy

public function index()
{
    return Auth::user()->can('view_Contact');
}

и такой метод проверки

/** @test */
public function a_user_without_permission_can_not_see_contacts()
{
    $this->login(['no_permission']);
    $this->get('/contacts')
        ->assertStatus(403);
}

Когда я запускаю свой тест, покажите мне эту ошибку

1) Tests\Feature\AccountTest::a_user_without_permission_can_not_see_contacts Illuminate\Auth\Access\AuthorizationException: это действие неавторизовано.

Примечание 1: когда я меняю свой контроллер на этот, он работает правильно и показывает мне зеленый

public function index()
{
    if(Auth::user()->can('view_Contact')){
      ........
    }else
    return response()->view('403',['msg' => 'you_not_have_not_permission'])->setStatusCode(403) ;

Примечание 2:
В методе входа в тестовый класс я отправляю параметры разрешений пользователя, и он работает правильно.


person paranoid    schedule 05.01.2020    source источник


Ответы (1)


метод authorize выдает исключение, если пользователь не авторизован. вам нужно использовать @expectesException или аналогичные методы, чтобы сигнализировать вашему тесту об ожидании исключения.

Или вы можете добавить условие в свой класс Handler, чтобы поймать такое исключение и вернуть ответ 403.


редактировать: больше объяснений

когда вы вызываете метод authorize и у пользователя нет разрешения, программа выдает исключение. когда пользователь вызывает API, исключение преобразуется в ответ со статусом 403 и показывается пользователю, но когда вы вызываете API из самой программы, возникает исключение и программа останавливается, поэтому будет никакого ответа в формате JSON. Чтобы справиться с этой ситуацией, у вас есть два варианта:

1- если вы решите не менять свою программу, то вместо того, чтобы ожидать ответа с определенным статусом, вы должны сказать своему тесту ожидать, что будет выброшено AuthorizationException. вы можете прочитать, как это сделать услышать

2- вы можете изменить свой код, чтобы вместо того, чтобы делегировать задачу обработки исключения Laravel, вы делали это сами в классе Handler и готовили ответ JSON со статусом 403, и тогда ваш тест должен быть выполнен правильно.

person Fatemeh Majd    schedule 05.01.2020