7

我正在关注这门课程testdrivenlaravel,它提到了一种禁用 Laravel 异常处理的方法,以防止 Laravel 处理发生的异常并抛出它,因此我们可以在测试输出中获得更详细的错误。

所以我在我的测试用例类中添加了这个方法,在渲染方法中我抛出了异常

protected function disableExceptionHandling() {

    $this->app->instance(Handler::class, new class extends Handler {
        public function __construct()
        {
        }
        public function report(\Exception $e)
        {
        }
        public function render($request, \Exception $e)
        {
            throw $e;
        }
    });
}

但是每当我在测试中调用它时,为了获得更详细的错误,我仍然会得到 Laravel 处理程序正在呈现的相同错误。

当我像这样直接更改Handler课程时:

public function render($request, Exception $exception)
{
    throw $exception;
    // return parent::render($request, $exception);
}

我得到了详细的错误,但我需要让disableExceptionHandling助手工作。

4

2 回答 2

21

把它放在你的测试方法的顶部:

    $this->withoutExceptionHandling();

您不需要为此创建方法,它包含在 laravel 的 'InteractsWithExceptionHandling' 特征中,您应该从测试中扩展抽象 TestCase 使用该特征。

于 2019-01-28T22:19:29.660 回答
3

在 2019 年,您尝试用方法替换的异常处理程序App\Exceptions\Handler(请参阅参考资料)绑定在 Laravel IoC 容器中的键处(请参阅它在哪里完成)。your_project\App\Exceptions\HandlerinstanceIlluminate\Contracts\Debug\ExceptionHandler::classyour_project/bootstrap/app.php

要替换实际的处理程序,您必须使用Illuminate\Contracts\Debug\ExceptionHandler::class默认绑定的相同键重新绑定它,而不是App\Exceptions\Handler您使用的。IE:

... 在 your_project/tests/TestCase.php

public function disableExceptionHandling()
{
    $this->app->instance(\Illuminate\Contracts\Debug\ExceptionHandler::class, new class extends Handler
    {
        public function render($request, \Exception $e)
        {
            throw $e;
        }
    });
}

最后确保您在上面的代码中引用的所有类在文件顶部都有正确的完全限定的命名空间提及。例如:

use App\Exceptions\Handler;

并确保您从测试中调用该方法。

注意:上述异常禁用方法对 Lumen 来说非常有用,因为 Lumen 中没有 Laravel 的实际方法(请参阅此答案$this->withoutExceptionHandling()中的更多详细信息)。

于 2019-08-23T07:07:51.103 回答