РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
1085 of 1361 menu

Метод 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' ); } } ?>

Результат выполнения теста:

<+html+> OK (1 test, 2 assertions) <-html+>

Смотрите также

  • класс KernelBrowser,
    который эмулирует браузер в тестах
  • метод request,
    который выполняет обычный HTTP-запрос
  • метод jsonRequest,
    который выполняет запрос с JSON-телом
  • метод getResponse,
    который возвращает объект ответа
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить