Метод assertSelectorCount
Метод assertSelectorCount относится к классу
KernelBrowser и используется в функциональных
тестах Symfony. Он проверяет, что CSS-селектор,
переданный первым параметром, встречается в HTML-коде
ответа ровно столько раз, сколько указано во втором
параметре. Если количество элементов не совпадает,
тест завершается с ошибкой.
Метод удобно применять, когда нужно убедиться, что на странице отрисовано определённое число карточек, строк таблицы, пунктов списка или других повторяющихся элементов.
Синтаксис
$client->assertSelectorCount(int $count, string $selector);
Пример
Давайте создадим контроллер, который выводит список из трёх элементов:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
class ArticleController extends AbstractController
{
#[Route('/articles', name: 'article_list')]
public function list(): Response
{
return $this->render('article/list.html.twig', [
'articles' => ['article 1', 'article 2', 'article 3'],
]);
}
}
?>
Теперь создадим Twig-шаблон, который выводит каждый
элемент списка в теге li с классом article-item:
<ul>
{% for article in articles %}
<li class="article-item">{{ article }}</li>
{% endfor %}
</ul>
Напишем функциональный тест, который проверяет, что
на странице ровно три элемента с классом
article-item:
<?php
namespace App\Tests\Controller;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
class ArticleControllerTest extends WebTestCase
{
public function testArticleListCount(): void
{
$client = static::createClient();
$client->request('GET', '/articles');
$client->assertSelectorCount(3, 'li.article-item');
}
}
?>
Если запустить этот тест, он завершится успешно,
так как на странице действительно три элемента
li.article-item.
Пример
Давайте рассмотрим ситуацию, когда количество элементов не совпадает. Изменим контроллер так, чтобы он выводил два элемента:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
class ArticleController extends AbstractController
{
#[Route('/articles', name: 'article_list')]
public function list(): Response
{
return $this->render('article/list.html.twig', [
'articles' => ['article 1', 'article 2'],
]);
}
}
?>
Теперь тест с ожиданием трёх элементов упадёт с сообщением о том, что найдено два элемента вместо трёх:
<?php
namespace App\Tests\Controller;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
class ArticleControllerTest extends WebTestCase
{
public function testArticleListCount(): void
{
$client = static::createClient();
$client->request('GET', '/articles');
$client->assertSelectorCount(3, 'li.article-item');
}
}
?>
Результат выполнения теста:
Failed asserting that 2 matches expected 3.
Пример
Метод assertSelectorCount можно использовать
и для проверки отсутствия элементов. Для этого
достаточно передать ноль в качестве количества:
<?php
namespace App\Tests\Controller;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
class ArticleControllerTest extends WebTestCase
{
public function testNoEmptyItems(): void
{
$client = static::createClient();
$client->request('GET', '/articles');
$client->assertSelectorCount(0, 'li.article-item.empty');
}
}
?>
Такой тест пройдёт успешно, если на странице нет
элементов с классом empty.
Смотрите также
-
метод
assertSelectorExists,
который проверяет наличие элемента на странице -
метод
assertSelectorNotExists,
который проверяет отсутствие элемента на странице -
метод
assertSelectorTextContains,
который проверяет текст внутри элемента -
класс
KernelBrowser,
который предоставляет методы для тестирования