Метод jsonRequest класса KernelBrowser
Метод jsonRequest класса KernelBrowser выполняет
HTTP-запрос к приложению, автоматически устанавливая
заголовок Content-Type в значение application/json
и кодируя переданные данные в формат JSON. Первым
параметром передаётся HTTP-метод, вторым - URL,
третьим - массив данных, которые будут отправлены
в теле запроса.
Синтаксис
$client->jsonRequest(string $method, string $uri, array $parameters = [], array $server = []);
Пример
Давайте создадим контроллер, который принимает JSON-данные и возвращает их обратно:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Attribute\Route;
class ApiController extends AbstractController
{
#[Route('/api/user', name: 'api_user', methods: ['POST'])]
public function user(Request $request): JsonResponse
{
$data = json_decode($request->getContent(), true);
return new JsonResponse([
'name' => $data['name'] ?? null,
'age' => $data['age'] ?? null,
]);
}
}
?>
Теперь напишем тест, который отправляет JSON-запрос на этот контроллер:
<?php
namespace App\Tests\Controller;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
class ApiControllerTest extends WebTestCase
{
public function testUser(): void
{
$client = static::createClient();
$client->jsonRequest('POST', '/api/user', [
'name' => 'abcde',
'age' => 30,
]);
$response = $client->getResponse();
$content = $response->getContent();
echo $content;
}
}
?>
Результат выполнения кода:
{"name":"abcde","age":30}
Пример
Давайте проверим, что сервер вернул статус-код 200
и корректный JSON:
<?php
namespace App\Tests\Controller;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
class ApiControllerTest extends WebTestCase
{
public function testUserStatus(): void
{
$client = static::createClient();
$client->jsonRequest('POST', '/api/user', [
'name' => 'abcde',
'age' => 30,
]);
$this->assertResponseIsSuccessful();
$this->assertResponseStatusCodeSame(200);
$this->assertResponseFormatSame('json');
}
}
?>
Результат выполнения кода:
OK (1 test, 3 assertions)
Пример
Давайте отправим JSON-запрос с дополнительными заголовками через четвёртый параметр:
<?php
namespace App\Tests\Controller;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
class ApiControllerTest extends WebTestCase
{
public function testUserWithHeaders(): void
{
$client = static::createClient();
$client->jsonRequest(
'POST',
'/api/user',
['name' => 'abcde', 'age' => 30],
['HTTP_X_REQUESTED_WITH' => 'XMLHttpRequest']
);
$response = $client->getResponse();
echo $response->getStatusCode();
}
}
?>
Результат выполнения кода:
200
Смотрите также
-
класс
KernelBrowser,
который используется для тестирования HTTP-запросов -
метод
request,
который выполняет обычный HTTP-запрос -
метод
xmlHttpRequest,
который выполняет AJAX-запрос -
метод
getResponse,
который возвращает объект ответа