Как правильно писать модульные тесты в Symfony 3 с учетом зависимостей в конструкторе?

При написании модульных тестов в 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);
        
        // Остальной код вашего теста
        // ...
    }
}

Оба этих подхода позволяют правильно учитывать зависимости в конструкторе вашего класса и создавать модульные тесты, которые могут успешно выполняться независимо от внешних зависимостей. Вы должны выбрать подход, который лучше всего соответствует вашим потребностям и предоставит вам удобство и гибкость при написании и тестировании кода.