@@ -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'
@@ -721,4 +721,54 @@ and compose your services with them::
721
721
as this will include the trait name, not the class name. Instead, use
722
722
``__CLASS__.'::'.__FUNCTION__ `` as the service id.
723
723
724
+ Testing a Service Subscriber
725
+ ----------------------------
726
+
727
+ To unit test a service subscriber, you can create a fake ``ServiceLocator ``::
728
+
729
+ use Symfony\Component\DependencyInjection\ServiceLocator;
730
+
731
+ $container = new class() extends ServiceLocator {
732
+ private $services = [];
733
+
734
+ public function __construct()
735
+ {
736
+ parent::__construct([
737
+ 'foo' => function () {
738
+ return $this->services['foo'] = $this->services['foo'] ?? new stdClass();
739
+ },
740
+ 'bar' => function () {
741
+ return $this->services['bar'] = $this->services['bar'] ?? $this->createBar();
742
+ },
743
+ ]);
744
+ }
745
+
746
+ private function createBar()
747
+ {
748
+ $bar = new stdClass();
749
+ $bar->foo = $this->get('foo');
750
+
751
+ return $bar;
752
+ }
753
+ };
754
+
755
+ $serviceSubscriber = new MyService($container);
756
+ // ...
757
+
758
+ Another alternative is to mock it using ``PHPUnit ``::
759
+
760
+ use Psr\Container\ContainerInterface;
761
+
762
+ $container = $this->createMock(ContainerInterface::class);
763
+ $container->expects(self::any())
764
+ ->method('get')
765
+ ->willReturnMap([
766
+ ['foo', $this->createStub(Foo::class)],
767
+ ['bar', $this->createStub(Bar::class)],
768
+ ])
769
+ ;
770
+
771
+ $serviceSubscriber = new MyService($container);
772
+ // ...
773
+
724
774
.. _`Command pattern` : https://en.wikipedia.org/wiki/Command_pattern
0 commit comments