Метод xmlHttpRequest
Метод xmlHttpRequest класса KernelBrowser
выполняет запрос к приложению, имитируя
асинхронный запрос из JavaScript. Первым
параметром передаётся HTTP-метод, вторым -
URL, третьим - дополнительные серверные
параметры. Метод автоматически устанавливает
заголовок X-Requested-With со значением
'XMLHttpRequest', что позволяет
контроллеру определить AJAX-запрос через
метод isXmlHttpRequest.
Метод возвращает объект Crawler, с
помощью которого можно исследовать
содержимое ответа.
Синтаксис
$client->xmlHttpRequest(string $method, string $uri, array $server = [])
Пример
Давайте создадим контроллер, который обрабатывает AJAX-запрос и возвращает JSON:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Routing\Attribute\Route;
class ApiController extends AbstractController
{
#[Route('/api/data', name: 'api_data')]
public function data(): JsonResponse
{
if (!$this->getRequest()->isXmlHttpRequest()) {
return new JsonResponse(['error' => 'not ajax'], 400);
}
return new JsonResponse(['message' => 'hello']);
}
}
?>
Теперь напишем тест, который выполняет AJAX-запрос к этому контроллеру:
<?php
namespace App\Tests\Controller;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
class ApiControllerTest extends WebTestCase
{
public function testAjaxRequest(): void
{
$client = static::createClient();
$crawler = $client->xmlHttpRequest('GET', '/api/data');
$response = $client->getResponse();
$content = $response->getContent();
$this->assertResponseIsSuccessful();
$this->assertJsonStringEqualsJsonString(
'{"message":"hello"}',
$content
);
}
}
?>
Результат выполнения теста:
OK (1 test, 2 assertions)
Пример
Давайте передадим дополнительные серверные параметры вместе с AJAX-запросом:
<?php
namespace App\Tests\Controller;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
class ApiControllerTest extends WebTestCase
{
public function testAjaxWithParams(): void
{
$client = static::createClient();
$crawler = $client->xmlHttpRequest('POST', '/api/data', [
'HTTP_X_CUSTOM_HEADER' => 'abcde',
]);
$response = $client->getResponse();
$this->assertResponseIsSuccessful();
$this->assertResponseHeaderSame(
'Content-Type',
'application/json'
);
}
}
?>
Результат выполнения теста:
Смотрите также
-
класс
KernelBrowser,
который эмулирует браузер в тестах -
метод
request,
который выполняет обычный HTTP-запрос -
метод
jsonRequest,
который выполняет запрос с JSON-телом -
метод
getResponse,
который возвращает объект ответа