UnauthorizedException не перехватывается с помощью Laravel 5/Codeception

Я пытаюсь перехватить UnauthorizedException с помощью Codeception в своем функциональном тесте. Что ж, на самом деле мой функциональный тест — это тесты Laravel, запускаемые кодированием. Итак, я пробовал 2 способа:

/** @test
 *
 * @expectedException UnauthorizedException
 */
public function test_exception()
{

    $this->visit("/associations/1/edit")

}

Or

 /** @test
 *
 */
public function test_exception()
{
   \PHPUnit_Framework_TestCase::setExpectedException(UnauthorizedException::class);
    $this->visit("/associations/1/edit")

}

В моем контроллере я просто запускаю его для проверки:

 throw new UnauthorizedException();

В обоих случаях он просто говорит:

Failed asserting that exception of type "UnauthorizedException" is thrown.

Вроде все нормально, но не работает... Есть идеи, почему???

РЕДАКТИРОВАТЬ: мой метод редактирования в контроллере

public function edit($id)
{

    $association = Association::findOrFail($id);
    $federation = $association->federation;

    if (Auth::user()->cannot('edit', $association)) { // I have checked with dd() my test goes here.
        throw new UnauthorizedException();
    }

    $users = User::all();
    $federations = Federation::all();

    return view('associations.form', compact('association', 'users', 'federations', 'federation'));
}

person Juliatzin    schedule 17.06.2016    source источник
comment
пространство имен пробовали? \Illuminate\Contracts\Validation\UnauthorizedException   -  person Angad Dubey    schedule 18.06.2016
comment
Я использую: use Illuminate\Contracts\Validation\UnauthorizedException; разве это не одно и то же?   -  person Juliatzin    schedule 18.06.2016
comment
Да, должно. Можете ли вы опубликовать полный метод контроллера   -  person Angad Dubey    schedule 18.06.2016
comment
который из???? отредактировать или обновить?   -  person Juliatzin    schedule 18.06.2016
comment
Тот, который выдает исключение   -  person Angad Dubey    schedule 18.06.2016
comment
ну, пока я тестирую, первая строка выдает исключение, это не нормальное поведение, но пока я даже не могу заставить его работать так   -  person Juliatzin    schedule 18.06.2016
comment
Тем не менее, я могу опубликовать весь метод, нет пб, он не большой   -  person Juliatzin    schedule 18.06.2016
comment
Пожалуйста, опубликуйте полный метод в любом случае. Это помогает другим воссоздать ход ваших мыслей и сузить круг вопросов.   -  person Angad Dubey    schedule 18.06.2016
comment
вы можете попробовать это вместо того, чтобы генерировать исключение? abort(403, 'Unauthorized action.');   -  person Angad Dubey    schedule 18.06.2016
comment
Я могу попробовать, но, насколько мне известно, прерывание всегда будет вызывать исключение HttpException.   -  person Juliatzin    schedule 18.06.2016
comment
возможно Вы правы. Я также проверю это с моей стороны, попробуйте также обновить тестовый пример, чтобы увидеть, перехватывает ли он HTTPException   -  person Angad Dubey    schedule 18.06.2016
comment
Да, он ловит исключение HttpException, подтверждено   -  person Juliatzin    schedule 18.06.2016
comment
Интересный. Я буду продолжать отладку.   -  person Angad Dubey    schedule 18.06.2016
comment
да, это первый раз, когда я пытаюсь поймать исключение в своих тестах, поэтому я не знаю, что не так... Я могу подтвердить, что и phpunit, и codeception реагируют одинаково   -  person Juliatzin    schedule 18.06.2016
comment
Вероятно, это не причина, но вы можете попробовать передать ему сообщение: throw new UnauthorizedException("not authorized");   -  person Angad Dubey    schedule 18.06.2016
comment
да, сделал, но безрезультатно   -  person Juliatzin    schedule 18.06.2016
comment
Взгляните на эту статью: laraveltips.wordpress. com/category/ Это может быть связано с тем, как Laravel обрабатывает исключения   -  person Angad Dubey    schedule 18.06.2016
comment
Фактически, это статья, в которой я использовал исключения в своем приложении.   -  person Juliatzin    schedule 18.06.2016


Ответы (1)


Наконец-то я получил решение от здесь:

Основная идея, я думаю, заключается в том, что исключение перехватывается и отправляется в обработчик, где возвращается представление.

Итак, для тестирования необходимо включить в Handler.php условие:

public function render($request, Exception $e)
{
    if (App::environment() == 'testing') {
        throw $e;
    }
    // Your exception management...

и теперь Exception выбрасывается!

person Juliatzin    schedule 18.06.2016