Я хочу проверить ответ при попытке отправить недопустимые данные в 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
Чего мне не хватает?