Laravel:如何在PhpUnit上启用stacktrace错误

时间:2017-01-30 21:22:26

标签: laravel laravel-5 phpunit tdd laravel-5.4

我有一个全新的laravel 5.4

我试图修改默认测试只是为了看到测试失败。

测试/ ExampleTest.php

Endpoint

我希望看到更详细的错误,例如class ExampleTest extends TestCase { /** * A basic test example. * * @return void */ public function testBasicTest() { $response = $this->get('/ooops'); $response->assertStatus(200); } } 等,而只是这个错误说

no route has been found or defined

如果没有有意义的错误,很难做TDD(是的,我知道在这种情况下404就足够了,但大部分时间都不是这样)。

有没有办法让堆栈跟踪与浏览器上显示的相同?或者至少接近那个,以便我知道我应该做的下一步是什么。

提前致谢。

2 个答案:

答案 0 :(得分:18)

对于Laravel 5.4,您可以使用Adam Wathan在this gist中提供的disableExceptionHandling方法(源代码如下)

现在,如果你参加考试:

$this->disableExceptionHandling();

您应该获得有助于您找到问题的完整信息。

对于Laravel 5.5及更高版本,您可以使用内置于Laravel中的withoutExceptionHandling方法

Adam Wathan的要点源代码

<?php

namespace Tests;

use App\Exceptions\Handler;
use Illuminate\Contracts\Debug\ExceptionHandler;
use Illuminate\Foundation\Testing\TestCase as BaseTestCase;

abstract class TestCase extends BaseTestCase
{
    use CreatesApplication;

    protected function setUp()
    {
        /**
         * This disables the exception handling to display the stacktrace on the console
         * the same way as it shown on the browser
         */
        parent::setUp();
        $this->disableExceptionHandling();
    }

    protected function disableExceptionHandling()
    {
        $this->app->instance(ExceptionHandler::class, new class extends Handler {
            public function __construct() {}

            public function report(\Exception $e)
            {
                // no-op
            }

            public function render($request, \Exception $e) {
                throw $e;
            }
        });
    }
}

答案 1 :(得分:2)

如果碰巧使用Laravel 5.5及更高版本,则可以使用内置方法:

$this->withoutExceptionHandling();
$this->withExceptionHandling();

要么在您的setUp方法中,要么在您的测试方法中。它们在以下trait中定义。

对于快速而肮脏的调试,您还可以在dump对象上使用response方法:

/** @test */
public function it_can_delete_an_attribute()
{
    $response = $this->json('DELETE', "/api/attributes/3");

    $response->dump()->assertStatus(200);

    $this->assertDatabaseMissing('table', [
        'id' => $id
    ]);

    ...
}

有一堂laracast的课程,涵盖了这些细节。