[Symfony] 機能テストでcreateClinet()を複数回実行するのはSymfony 4.4以降で非推奨になっているので注意
createClient()
は複数回実行してはいけない
Symfony 4.4以降は Symfony 4.4以上で機能テストを書いていて、以下のようなdeprecation noticeが出たことはありませんか?
1x: Calling "Symfony\Bundle\FrameworkBundle\Test\WebTestCase::createClient()" while a kernel has been booted is deprecated since Symfony 4.4 and will throw in 5.0, ensure the kernel is shut down before calling the method.
1x in FooControllerTest::testIndex from App\Controller
エラーメッセージ を読むと、カーネルが起動している状態でさらに別のカーネルを起動させる行為はSymfony 4.4以降で非推奨となっているとのことです。
よくある、ログイン機能のあるサイトでBASIC認証を使って異なるログイン状態のクライアントを複数作成するようなテストを書いていると、この非推奨に抵触することになります🤔
解決方法
こちらのStack Overflow にあるとおり、 WebTestCase
クラスが ensureKernelShutdown()
という既存のカーネルをシャットダウンしてくれるメソッドを提供してくれているので、2つ目のクライアントを生成する前にこれを呼び出すようにしておけば、deprecation noticeは出なくなります。
+ self::ensureKernelShutdown();
self::createClient();
liip/test-fixtures-bundle の
FixturesTrait
を導入してsetUp()
内でloadFixtureFiles()
を実行している場合は、どうやら内部でcreateClient()
が実行されているようなので、テストコード中の1つ目のcreateClient()
に対してもこの対応が必要になります。
毎回 self::ensureKernelShutdown()
を呼び出すのは手間なので、 createClient()
メソッドをオーバーライドしてしまうのがよいと思います。
protected static function createClient(array $options = [], array $server = []): KernelBrowser
{
self::ensureKernelShutdown();
return parent::createClient($options, $server);
}
これをテストクラスに書いておけば、今までどおり普通に self::createClient()
しても内部で self::ensureKernelShutdown()
が実行されるのでdeprecation noticeは出ません👌
Discussion