Download the PHP package mekras/symfony-bundle-testing without Composer
On this page you can find all versions of the php package mekras/symfony-bundle-testing. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.
Download mekras/symfony-bundle-testing
More information about mekras/symfony-bundle-testing
Files in mekras/symfony-bundle-testing
Package symfony-bundle-testing
Short Description Инструменты для тестирования пакетов Symfony
License MIT
Informations about the package symfony-bundle-testing
Инструменты для тестирования пакетов Symfony
Эта библиотека предоставляет инструменты для автоматизированного тестирования пакетов (bundles) Symfony.
Оглавление
- Установка
- Требования
- Установка через Composer
- Интеграционные тесты
- Основной класс интеграционных тестов
- Определение имени главного класса вашего пакета
- Написание тестов
- Как проверить, что в контейнере есть нужна служба?
- Как получить службу из контейнера?
- Как добавить другие пакеты в контейнер?
- Как устранить ошибку «service or alias has been removed or inlined»?
Установка
Требования
- PHP 7.4+
- Symfony 5.4+
Установка через Composer
В консоли в корне проекта выполните команду:
composer require --dev mekras/symfony-bundle-testing
Интеграционные тесты
Интеграционные тесты позволяют проверить как в действительности будет вести себя ваш код во взаимодействии с Symfony.
Основной класс интеграционных тестов
Рекомендуется в каждом проекте создавать отдельный основной класс для всех классов ваших интеграционных тестов, как единую точку определения конфигурации тестов и добавления общих методов.
Этот класс должен быть унаследован от BaseSymfonyIntegrationTestCase.
Пример — tests/Integration/IntegrationTestCase.php
:
Все классы интеграционных тестов должны наследоваться либо от этого класса, либо от
BaseSymfonyIntegrationTestCase
.
Определение имени главного класса вашего пакета
Важным элементом интеграционного тестирования пакета Symfony является знание его главного класса
(*Bundle
). За это отвечает метод BaseSymfonyIntegrationTestCase::getBundleClass()
.
Если вы следуете
соглашениям по именованию пакетов,
то getBundleClass()
должен правильно определять и возвращать имя класса. Если же он этого не
делает, можете переопределить его в своём IntegrationTestCase
:
Написание тестов
Костяк теста выглядит так:
Как правило, вначале надо создать контейнер зависимостей, т. к. почти вся интеграция с Symfony
ведётся через него. Метод $this->createContainer()
создаёт тестовый контейнер (он подробно описан
ниже), который будет являться основной ваших тестов.
Контейнер создаётся с минимально необходимой предварительной конфигурацией:
- устанавливаются важные параметры
kernel.*
; - регистрируются пакеты, возвращаемые методом
getRequiredBundles()
(см. далее); - регистрируется тестируемый пакет, определяемый описанным выше методом
getBundleClass()
; - выполняется ряд других действий.
После создания контейнера, но до его компиляции вы можете произвести с ним дополнительные действия по настройке или задать ожидания, как будет описано ниже.
Далее контейнер необходимо скомпилировать, чтобы привести его в состояние, соответствующее времени
выполнения приложения. Это делается методом $container->compile()
.
После компиляции можно выполнить нужные действия по проверке получившегося контейнера.
Ниже эти вопросы будут рассмотрены подробнее.
Тестовый контейнер зависимостей
Сердцем интеграционных тестов является контейнер зависимостей, позволяющий проверить правильность регистрации в нём расширений вашего пакета, взаимодействие с ядром Symfony и/или другими пакетами.
Для создания тестового контейнера используйте метод
BaseSymfonyIntegrationTestCase::createContainer
:
Метод создаст и вернёт новый экземпляр класса
TestContainerBuilder, расширяющего стандартный
ContainerBuilder
Symfony описанными ниже возможностями.
В одном тесте можно создать несколько независимых контейнеров.
Загрузка расширений контейнера зависимостей
Метод предназначен для тестирования расширений контейнера зависимостей Symfony и позволяет проверить, правильно ли эти расширения загружаются, правильно ли настраивают контейнер.
Загрузка в контейнер зависимостей других пакетов
Как проверить, что в контейнере есть нужна служба?
Предположим, ваш пакет должен зарегистрировать в контейнере службы с идентификаторами
some.service.id
и щерук.service.id
. Проверить, что это действительно делается, можно так:
Как получить службу из контейнера?
Публичные службы можно получить обычным способом — через метод Container::get()
:
Приватные службы можно получать через локатор или сделать публичными.
Получение через локатор:
Сделать публичной:
Как добавить другие пакеты в контейнер?
Если вы хотите протестировать интеграцию с другими пакетами, их можно добавить в тестовый контейнер
с помощью метода BaseSymfonyIntegrationTestCase::getBundleClass()
.
Для одного теста это можно сделать непосредственно в нём между созданием и компиляцией контейнера:
Если это нужно для всех ваших тестов, то рекомендуется переопределить метод
createContainer
в основном классе:
Так же есть возможность сразу задать список пакетов, которые надо загружать, переопределив метод
getRequiredBundles()
:
Как устранить ошибку «service or alias has been removed or inlined»?
Если при извлечении из тестового контейнера вы столкнулись с такой ошибкой:
The "foo" service or alias has been removed or inlined when the container was compiled. You should either make it public, or stop using the container directly and use dependency injection instead.
то решить её можно сделав эту службу публичной, указав её в аргументе $public
метода
createContainer()
:
All versions of symfony-bundle-testing with dependencies
nyholm/psr7 Version ^1.5
symfony/browser-kit Version ^5.4|^6.0|^7.0
symfony/framework-bundle Version ^5.4|^6.0|^7.0
symfony/yaml Version ^5.3|^6.0