webignition / symfony-test-service-injector-trait
将 Symfony 服务注入到测试类属性中
0.2
2021-02-23 15:51 UTC
Requires
- php: >=7.4.0|^8
Requires (Dev)
- phpstan/phpstan: ^0.12.78
- squizlabs/php_codesniffer: ^3.5
- symplify/easy-coding-standard: ^9.2
README
一个用于在您的 Symfony 测试中将容器中的服务填充到测试类属性的 trait。
如何使用
- 在任何扩展
Symfony\Bundle\FrameworkBundle\Test\KernelTestCase
的测试中使用use TestClassServicePropertyInjectorTrait
- 在您的
setUp()
方法中调用$this->injectContainerServicesIntoClassProperties()
它的作用
将所有私有和受保护的属性设置为它们各自的服务。要设置属性,它必须
- 是
private
或protected
- 类型提示为非标量类型
- 具有与容器中服务匹配的类型提示
使用示例
use App\Services\FooService; use App\Services\BarService; use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; use webignition\SymfonyTestServiceInjectorTrait\TestClassServicePropertyInjectorTrait; class AcmeControllerTest extends WebTestCase { use TestClassServicePropertyInjectorTrait; private FooService $fooService; private BarService $barService; protected function setUp(): void { parent::setUp(); $this->injectContainerServicesIntoClassProperties(); } public function testUsingFooService(): void { $foo = $this->fooService->createFoo(); // ... carry out tests that depend on FooService creating $foo } public function testUsingBarService(): void { $bar = $this->barService->createBar(); // ... carry out tests that depend on BarService creating $bar } }
前后比较
之前
use App\Services\ServiceA; use App\Services\ServiceB; use App\Services\ServiceC; use App\Services\ServiceD; use App\Services\ServiceE; use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; class AcmeControllerTest extends WebTestCase { private ServiceA $serviceA; private ServiceB $serviceB; private ServiceC $serviceC; private ServiceD $serviceD; private ServiceE $serviceE; protected function setUp(): void { parent::setUp(); $serviceA = self::$container->get(ServiceA::class); if ($serviceA instanceof ServiceA) { $this->serviceA = $serviceA; } $serviceB = self::$container->get(ServiceB::class); if ($serviceB instanceof ServiceB) { $this->$serviceB = $serviceB; } $serviceC = self::$container->get(ServiceC::class); if ($serviceC instanceof ServiceC) { $this->$serviceC = $serviceC; } $serviceD = self::$container->get(ServiceD::class); if ($serviceD instanceof ServiceD) { $this->$serviceD = $serviceD; } $serviceE = self::$container->get(ServiceE::class); if ($serviceE instanceof ServiceE) { $this->$serviceE = $serviceE; } } }
之后
use App\Services\ServiceA; use App\Services\ServiceB; use App\Services\ServiceC; use App\Services\ServiceD; use App\Services\ServiceE; use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; use webignition\SymfonyTestServiceInjectorTrait\TestClassServicePropertyInjectorTrait; class AcmeControllerTest extends WebTestCase { use TestClassServicePropertyInjectorTrait; private ServiceA $serviceA; private ServiceB $serviceB; private ServiceC $serviceC; private ServiceD $serviceD; private ServiceE $serviceE; protected function setUp(): void { parent::setUp(); $this->injectContainerServicesIntoClassProperties(); } }