Я работаю над пакетом и использую пакет Orchestra/Testbench для своих модульных тестов.
Я пытаюсь написать тест PHPUnit, который проверяет правильность ответа при возникновении исключения. В моем репозитории я бросаю следующее исключение:
use Acme\Common\Exceptions\ValidationException;
...
throw new ValidationException($validator);
Я зарегистрировал класс обработчика в поставщике услуг пакетов:
$this->app->singleton('Illuminate\Contracts\Debug\ExceptionHandler', 'Acme\Common\Exceptions\Handler');
Однако метод render() в классе Handler не запускается. Здесь метод render():
public function render($request, Exception $e)
{
if ($e instanceof \Acme\Common\Exceptions\ValidationException) {
$message = implode(' ', array_flatten($exception->getMessages()->toArray()));
$response = array('errorCode' => $exception->getCode());
return \Response::make($response, 400);
}
return parent::render($request, $e);
}
Вместо этого я просто получаю общий метод исключения:
Acme\Common\Exceptions\ValidationException: {"key":["The key field is required."]}
Я даже поставил dd() в начале метода render(), но ничего. Я пропустил какую-то настройку с оркестром Testbench?
Вы случайно отвергаете конструктор в этом классе? У меня была такая же проблема (пытаясь поймать также ValidationException), и я не понимал, что испортил конструктор. Вероятно, происходит то, что что-то вызывает исключение, которое не попадает (поскольку это происходит в вашем обработчике исключений!). В моем случае я переопределял конструктор, который означал, что родительский класс не получал введенный класс журнала, что вызывало исключение исключения и прекращение действий до того, как был запущен метод рендеринга.
Вы вводите класс Exception через переменную " $e
", но в вашем методе вы вызываете переменную " $exception
".
Поскольку $exception
-variable не задано, вы должны использовать $e
-variable.
public function render($request, Exception $e)
{
if ($e instanceof \Acme\Common\Exceptions\ValidationException) {
$message = implode(' ', array_flatten($e->getMessages()->toArray()));
$response = array('errorCode' => $e->getCode());
return \Response::make($response, 400);
}
return parent::render($request, $e);
}