@@ -256,7 +256,7 @@ argument of type ``service_locator``:
256
256
# config/services.yaml
257
257
services :
258
258
App\CommandBus :
259
- arguments :
259
+ arguments :
260
260
- !service_locator
261
261
App\FooCommand : ' @app.command_handler.foo'
262
262
App\BarCommand : ' @app.command_handler.bar'
@@ -731,4 +731,54 @@ and compose your services with them::
731
731
return type were *subscribed *. This still works in 5.4 but is deprecated (only
732
732
when using PHP 8) and will be removed in 6.0.
733
733
734
+ Testing a Service Subscriber
735
+ ----------------------------
736
+
737
+ To unit test a service subscriber, you can create a fake ``ServiceLocator ``::
738
+
739
+ use Symfony\Component\DependencyInjection\ServiceLocator;
740
+
741
+ $container = new class() extends ServiceLocator {
742
+ private $services = [];
743
+
744
+ public function __construct()
745
+ {
746
+ parent::__construct([
747
+ 'foo' => function () {
748
+ return $this->services['foo'] = $this->services['foo'] ?? new stdClass();
749
+ },
750
+ 'bar' => function () {
751
+ return $this->services['bar'] = $this->services['bar'] ?? $this->createBar();
752
+ },
753
+ ]);
754
+ }
755
+
756
+ private function createBar()
757
+ {
758
+ $bar = new stdClass();
759
+ $bar->foo = $this->get('foo');
760
+
761
+ return $bar;
762
+ }
763
+ };
764
+
765
+ $serviceSubscriber = new MyService($container);
766
+ // ...
767
+
768
+ Another alternative is to mock it using ``PHPUnit ``::
769
+
770
+ use Psr\Container\ContainerInterface;
771
+
772
+ $container = $this->createMock(ContainerInterface::class);
773
+ $container->expects(self::any())
774
+ ->method('get')
775
+ ->willReturnMap([
776
+ ['foo', $this->createStub(Foo::class)],
777
+ ['bar', $this->createStub(Bar::class)],
778
+ ])
779
+ ;
780
+
781
+ $serviceSubscriber = new MyService($container);
782
+ // ...
783
+
734
784
.. _`Command pattern` : https://en.wikipedia.org/wiki/Command_pattern
0 commit comments