-ao- ramune blog

©2022 unio / GO2直営からふるラムネ
2020年09月22日

Symfony5のテストでDIコンテナのサービスを使いたい

対象バージョン
  • Symfony 5.1.5
  • PHPUnit 8.3.5

テストでDIコンテナのサービスを使う

Symfony5のKernelTestCaseを継承して、self::bootKernel()を呼び出すことでDIコンテナを扱えます。

HogeTest.php
                
                    // PHPUnitのTestCaseではなく、SymfonyのKernelTestCaseを使います
                    use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;

                    use Symfony\Component\Validator\Validator\ValidatorInterface;

                    class HogeTest extends KernelTestCase
                    {
                        /** @var ValidatorInterface */
                        private $validator;

                        protected function setUp(): void
                        {
                            // テスト用のKernelを起動することで、DIコンテナを使える
                            $kernel = self::bootKernel();
                            $container = $kernel->getContainer();
                            $this->validator = $container->get('validator');
                        }

                        public function testPiyo() { ... }
                    }
                
            

テストを動かすと.envの変数が無いとエラーが発生する場合があります。

                
                    bin/phpunit -v
                
            
                
                    1) App\Tests\HogeTest::testPiyo
                    Symfony\Component\DependencyInjection\Exception\EnvNotFoundException: Environment variable not found: "HOGE_DATABASE_URL".
                
            

その場合は、phpunit.xml.dist<php>内に、.envの変数を設定することで解決します。

phpunit.xml.dist
                
                    <php>
                        ...
                        <!-- define your env variables for the test env here -->
                        <env name="HOGE_DATABASE_URL" value="...."/>
                    </php>