Не могу сделать утверждения, потому что исключения сбивают мой тест в Laravel - PullRequest
0 голосов
/ 18 февраля 2019

Я хочу проверить ответ при попытке отправить недопустимые данные в API.

/** @test */
public function request_schedule_with_invalid_bdate()
{
    $response = $this->json('GET', '/api/schedule', [
      'bdate' => 'thisaintadate',
    ]);

    $response->assertStatus(422);
}

В соответствии с документацией он должен вернуть 422

Если правила проверки пройдут, ваш код будет работать нормально;однако, если проверка не пройдена, будет выдано исключение, и правильный ответ об ошибке будет автоматически отправлен обратно пользователю.В случае традиционного HTTP-запроса будет сгенерирован ответ о перенаправлении, в то время как JSON-ответ будет отправлен для AJAX-запросов.

Также

При использованииМетод validate во время запроса AJAX, Laravel ... генерирует ответ JSON, содержащий все ошибки валидации.Этот ответ JSON будет отправлен с кодом состояния HTTP 422.

Похоже, что Laravel должен автоматически обработать выданное исключение и продолжить отправку ответа.

Однако, запустив его вPHPUnit просто вызовет ошибку.

There was 1 error:

1) Tests\Feature\ScheduleTest::request_schedule_with_invalid_bdate
Illuminate\Validation\ValidationException: The given data was invalid.

Я прочитал этот вопрос , но использование $this->expectException(...); сделает тестовый проход, но не выполнит мои утверждения.Если я утверждаю, что статус является чем-то другим, кроме 422, он все равно пройдет.

Мой контроллер имеет это:

public function show(Request $request) 
{
  $attributes = $request->validate([
    'bdate' => 'required|date'
  ]);

  return ['data' => "It's valid."]
}

Вот мой класс ExceptionHandler (по запросу Мартина Х.) Это как раз то что из коробки.Я еще не коснулся этого класса.

<?php

namespace App\Exceptions;

use Exception;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;

class Handler extends ExceptionHandler
{
    /**
     * A list of the exception types that are not reported.
     *
     * @var array
     */
    protected $dontReport = [
        //
    ];

    /**
     * A list of the inputs that are never flashed for validation exceptions.
     *
     * @var array
     */
    protected $dontFlash = [
        'password',
        'password_confirmation',
    ];

    /**
     * Report or log an exception.
     *
     * @param  \Exception  $exception
     * @return void
     */
    public function report(Exception $exception)
    {
        parent::report($exception);
    }

    /**
     * Render an exception into an HTTP response.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Exception  $exception
     * @return \Illuminate\Http\Response
     */
    public function render($request, Exception $exception)
    {
        return parent::render($request, $exception);
    }
}

Я подтвердил следующее:

  • Laravel Framework 5.7.21 (php artisan --version output)
  • Он запускает соответствующий код / ​​контроллер на основе трассировки стека:

    ... / vendor / laravel / framework / src / Illuminate / Validation / Validator.php: 315 ... / vendor / laravel/framework/src/Illuminate/Validation/Factory.php:136 ... / vendor / laravel / framework / src / Illuminate / Foundation / Providers / FoundationServiceProvider.php: 53 ... / vendor / laravel / framework / src / Illuminate/Support/Traits/Macroable.php:108 ... / app / Http / Controllers / MyController.php: 35

Чего мне не хватает?

1 Ответ

0 голосов
/ 19 февраля 2019

У меня возникла проблема с аварийным завершением теста ValidationException, поскольку я отключил обработку исключений.Я отключил обработку исключений, чтобы лучше отлаживать свои тесты (ирония, я знаю), и я забыл, что сделал это.

class ... extends TestCase 
{
    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->withoutExceptionHandling();
    }

Удаление $this->withoutExceptionHandling(); теперь позволяет мне делать утверждения в ответе.

There was 1 failure:

1) Tests\Feature\ScheduleTest::request_schedule_with_invalid_bdate
Expected status code 200 but received 422.
Failed asserting that false is true.

Соответствующие ссылки: - https://github.com/laravel/framework/issues/26013 - phraunit phpunit при обработке исключений

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...