🎻

[Symfony] 機能テストでcreateClinet()を複数回実行するのはSymfony 4.4以降で非推奨になっているので注意

2020/08/01に公開

Symfony 4.4以降は createClient() は複数回実行してはいけない

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-bundleFixturesTrait を導入して 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は出ません👌

GitHubで編集を提案

Discussion