Метод withoutExceptionHandling
Метод withoutExceptionHandling применяется к экземпляру класса TestCase в тестах Laravel. Он отключает стандартный обработчик исключений, который обычно преобразует ошибки в HTTP-ответы с соответствующими статусами. Это позволяет тестировщику видеть полную информацию об исключении, включая стек вызовов, что значительно упрощает процесс отладки и выявления проблем в коде. Метод не принимает никаких параметров и вызывается непосредственно перед выполнением тестируемого запроса.
Синтаксис
<?php
$this->withoutExceptionHandling();
?>
Метод вызывается без параметров и должен быть использован перед выполнением HTTP-запроса в тесте. После вызова этого метода все исключения, возникающие в коде, будут проброшены напрямую, вместо того чтобы быть перехваченными и преобразованными в ответы с кодами ошибок. Это особенно полезно при отладке тестов, когда стандартные сообщения об ошибках не дают достаточной информации.
Пример
Рассмотрим тест, который проверяет создание статьи. Без использования withoutExceptionHandling исключение будет перехвачено и преобразовано в HTTP-ответ:
<?php
namespace Tests\Feature;
use Tests\TestCase;
use App\Models\Article;
use Illuminate\Foundation\Testing\RefreshDatabase;
class ArticleTest extends TestCase
{
use RefreshDatabase;
public function test_article_creation()
{
$data = [
'title' => 'Test Article',
'content' => 'Test content',
];
$res = $this->post('/api/articles', $data);
$res->assertStatus(201);
}
}
?>
Результат выполнения кода при возникновении ошибки:
"Illuminate\Validation\ValidationException: The given data was invalid."
Пример
Теперь используем withoutExceptionHandling, чтобы увидеть полную информацию об ошибке:
<?php
namespace Tests\Feature;
use Tests\TestCase;
use App\Models\Article;
use Illuminate\Foundation\Testing\RefreshDatabase;
class ArticleTest extends TestCase
{
use RefreshDatabase;
public function test_article_creation_without_exception_handling()
{
$this->withoutExceptionHandling();
$data = [
'title' => 'Test Article',
'content' => 'Test content',
];
$res = $this->post('/api/articles', $data);
$res->assertStatus(201);
}
}
?>
Результат выполнения кода при возникновении ошибки:
"Illuminate\Validation\ValidationException: The given data was invalid.
Failed asserting that 302 is identical to 201."
Пример
Метод withoutExceptionHandling часто используется в связке с методом followingRedirects для отладки редиректов:
<?php
namespace Tests\Feature;
use Tests\TestCase;
use App\Models\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
class UserTest extends TestCase
{
use RefreshDatabase;
public function test_user_registration_without_exception_handling()
{
$this->withoutExceptionHandling();
$user = [
'name' => 'John Doe',
'email' => 'john@example.com',
'password' => 'password123',
];
$res = $this->post('/register', $user);
$res->assertRedirect('/dashboard');
}
}
?>
Результат выполнения кода при возникновении ошибки:
"Symfony\Component\HttpKernel\Exception\HttpException: The user is not authenticated."
Смотрите также
-
класс
TestCase,
который является базовым классом для всех тестов -
метод
withoutMiddleware,
который отключает middleware для тестирования -
метод
followingRedirects,
который выполняет автоматический переход по редиректам -
класс
RefreshDatabase,
который обновляет базу данных перед каждым тестом