#
ドキュメント

Document

自分のための備忘録です。

参考

Testing

インストール

composer require --dev symfony/test-pack

composer.json

+    "require-dev": {
+        "phpunit/phpunit": "^9.5",
+        "symfony/browser-kit": "7.2.*",
+        "symfony/css-selector": "7.2.*",
+        "symfony/phpunit-bridge": "^7.2"

[!NOTE] composer.json の下記記述は symfony/test-pack 導入時ではなくて symfony new 実行時に設定されます。

"autoload-dev": { "psr-4": { "App\Tests\": "tests/" } },

テスト

[!IMPORTANT] 親クラスはおもに以下のクラスを使用します。

  • 単体テスト PHPUnit 提供クラス PHPUnit\Framework\TestCase
    class SampleTest extends \PHPUnit\Framework\TestCase { }
  • 結合テスト Symfony 提供クラス Symfony\Bundle\FrameworkBundle\Test\KernelTestCase
    class SampleTest extends \Symfony\Bundle\FrameworkBundle\Test\KernelTestCase { }

サービスのテスト

<?php

namespace App\Service;

class Sample
{
    public function echo(string $message): string
    {
        return $message;
    }
}
<?php

namespace App\Tests\Service;

use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
use App\Service\Sample;

// KernelTestCase を継承
class SampleServiceTest extends KernelTestCase
{
    public function testSomething(): void
    {
        // (1) boot the Symfony kernel
        self::bootKernel();

        // (2) use static::getContainer() to access the service container
        $container = static::getContainer();

        // (3) run some service & test the result
        $sample = $container->get(Sample::class);

        $this->assertEquals('Hello World!', $sample->echo('Hello World!'));
    }
}

上記は テスト対象のサービスが public でないとエラーになります。
services_test.yaml を使ってテストのときだけ public にできます。

# config/services.yaml
// ...
    # service
    App\Service\Sample:
        public: false
// ...
# config/services_test.yaml
services:
    App\Service\Sample:
        public: true # テストのときだけ public にする

[!IMPORTANT] services_test.yaml はテストのときだけ読み込まれて以下のように動作します。

  • services.yaml に定義されたサービスはすべて適用される
  • services_test.yaml に同じサービスがある場合は、それが上書きされる
  • services_test.yaml に新しいサービスを追加できる