При написании модульных тестов в Symfony 3 с учетом зависимостей в конструкторе, есть несколько подходов, которые помогут вам правильно организовать код тестов и обеспечить правильную инъекцию зависимостей.
Первый подход, который можно использовать, - это использование контейнера Symfony для создания объектов, включая необходимые зависимости. Для этого вам нужно использовать контейнер внутри своего теста. Например, если ваш конструктор принимает зависимость SomeDependency
, вы можете получить эту зависимость из контейнера и передать ее в конструктор вашего тестируемого класса. Это можно сделать следующим образом:
use SymfonyBundleFrameworkBundleTestKernelTestCase; use AcmeSomeClass; class SomeClassTest extends KernelTestCase { public function testSomething() { self::bootKernel(); $container = self::$kernel->getContainer(); $someDependency = $container->get('acme.some_dependency'); $someClass = new SomeClass($someDependency); // Остальной код вашего теста // ... } }
Второй подход, который можно применять, заключается в том, чтобы использовать фиктивные объекты (mock objects) для эмуляции зависимостей в тестах. Фиктивные объекты представляют собой объекты, которые имитируют поведение реальных объектов, но без реализации их функциональности. Это позволяет вам контролировать и проверять внешние взаимодействия вашего тестируемого класса.
Для создания фиктивных объектов и установки их в качестве зависимостей использоваться могут различные фреймворки, такие как PHPUnit или Prophecy. Ниже приведен пример использования PHPUnit для создания фиктивного объекта SomeDependency
и его передачи в конструктор класса SomeClass
:
use PHPUnitFrameworkTestCase; use AcmeSomeDependency; use AcmeSomeClass; class SomeClassTest extends TestCase { public function testSomething() { $someDependency = $this->createMock(SomeDependency::class); $someClass = new SomeClass($someDependency); // Остальной код вашего теста // ... } }
Оба этих подхода позволяют правильно учитывать зависимости в конструкторе вашего класса и создавать модульные тесты, которые могут успешно выполняться независимо от внешних зависимостей. Вы должны выбрать подход, который лучше всего соответствует вашим потребностям и предоставит вам удобство и гибкость при написании и тестировании кода.