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>