web-dev-qa-db-fra.com

Laravel: Comment activer l'erreur stacktrace sur PhpUnit

J'ai une nouvelle installation de laravel 5.4

J'ai essayé de modifier le test par défaut juste pour voir un test qui échoue.

tests/ExampleTest.php

class ExampleTest extends TestCase
{
    /**
     * A basic test example.
     *
     * @return void
     */
    public function testBasicTest()
    {
        $response = $this->get('/ooops');

        $response->assertStatus(200);
    }
}

Je m'attendais à voir une erreur plus détaillée comme no route has been found or defined etc, mais juste cette erreur disant

Time: 1.13 seconds, Memory: 8.00MB

There was 1 failure:

1) Tests\Feature\ExampleTest::testBasicTest
Expected status code 200 but received 404.
Failed asserting that false is true.

/var/www/vendor/laravel/framework/src/Illuminate/Foundation/Testing/TestResponse.php:51
/var/www/tests/Feature/ExampleTest.php:21

C'est vraiment difficile de faire TDD sans erreur significative (ouais je sais que 404 dans ce cas est suffisant, mais la plupart du temps ce n'est pas le cas).

Existe-t-il un moyen d'activer la trace de pile identique à celle affichée sur le navigateur? Ou du moins plus proche de celui-là pour que je sache quelle est la prochaine étape que je devrais faire.

Merci d'avance.

15
Jaime Sangcap

Pour Laravel 5.4 vous pouvez utiliser la méthode disableExceptionHandling présentée par Adam Wathan dans ce Gist (code source ci-dessous)

Maintenant, si vous exécutez votre test:

$this->disableExceptionHandling();

vous devriez obtenir des informations complètes qui vous aideront à trouver le problème.

Pour Laravel 5.5 et plus, vous pouvez utiliser la méthode withoutExceptionHandling intégrée à Laravel

Code source de Adam Wathan's Gist

<?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;
            }
        });
    }
}
22
Marcin Nabiałek

S'il vous arrive d'utiliser Laravel 5.5 et plus, vous pouvez utiliser les méthodes intégrées:

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

Soit dans votre méthode setUp, soit dans votre méthode de test. Ils sont définis dans ce qui suit trait .

Pour un débogage rapide et sale, vous pouvez également utiliser la méthode dump sur l'objet 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
    ]);

    ...
}

Il y a une leçon laracast qui couvre ces détails.

6
Patrick.SE