禁用测试的Laravel异常处理

时间:2018-06-02 10:33:46

标签: laravel tdd

我正在按照这个课程 testdrivenlaravel 进行操作,它提到了一种禁用Laravel异常处理的方法,以防止Laravel处理发生的异常并转而抛出它,这样我们就可以得到更详细的错误我们的测试输出。

所以我在我的testcase类中添加了这个方法,而在render方法中我抛出异常

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渲染相同的错误。

当我直接更改Handler类时:

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

我收到了详细的错误,但我需要让disableExceptionHandling帮助器工作。

2 个答案:

答案 0 :(得分:1)

在2019年,您尝试用App\Exceptions\Handler方法替换的异常处理程序your_project\App\Exceptions\Handler(请参阅instance)绑定在Laravel IoC容器中的Illuminate\Contracts\Debug\ExceptionHandler::class键处(请参阅{{ 1}}完成的地方。

要替换实际的处理程序,您必须使用默认绑定到的同一your_project/bootstrap/app.php键而不是您使用的Illuminate\Contracts\Debug\ExceptionHandler::class重新绑定它。即:

...在your_project / tests / TestCase.php中

App\Exceptions\Handler

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

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

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

注意:上述异常禁用方式对流明非常有用,因为流明中没有Laravel的实际use App\Exceptions\Handler; 方法(请参见this answer中的更多详细信息)。

答案 1 :(得分:0)

将其放在测试方法的顶部:

    $this->withoutExceptionHandling();

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