Skip to content

Commit 436e2fc

Browse files
javiereguiluzwouterj
authored andcommitted
[Testing] Updated the contents about getting the container in tests
1 parent 0153411 commit 436e2fc

File tree

1 file changed

+34
-57
lines changed

1 file changed

+34
-57
lines changed

testing.rst

Lines changed: 34 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -544,74 +544,51 @@ You can also get the objects related to the latest request::
544544
Accessing the Container
545545
~~~~~~~~~~~~~~~~~~~~~~~
546546

547-
It's highly recommended that a functional test only tests the response. But
548-
under certain very rare circumstances, you might want to access some services
549-
to write assertions. Given that services are private by default, test classes
550-
define a property that stores a special container created by Symfony which
551-
allows fetching both public and all non-removed private services::
552-
553-
// gives access to the same services used in your test, unless you're using
554-
// $client->insulate() or using real HTTP requests to test your application
555-
// don't forget to call self::bootKernel() before, otherwise, the container
556-
// will be empty
557-
$container = self::$container;
558-
559-
For a list of services available in your application, use the ``debug:container``
560-
command.
561-
562-
If a private service is *never* used in your application (outside of your test),
563-
it is *removed* from the container and cannot be accessed as described above. In
564-
that case, you can create a public alias in the ``test`` environment and access
565-
it via that alias:
547+
Functional tests should only test the response (e.g. its contents or its HTTP
548+
status code). However, in some rare circumstances you may need to access the
549+
container to use some service.
566550

567-
.. configuration-block::
568-
569-
.. code-block:: yaml
570-
571-
# config/services_test.yaml
572-
services:
573-
# access the service in your test via
574-
# self::$container->get('test.App\Test\SomeTestHelper')
575-
test.App\Test\SomeTestHelper:
576-
# the id of the private service
577-
alias: 'App\Test\SomeTestHelper'
578-
public: true
551+
First, you can get the same container used in the application, which only
552+
includes the public services::
579553

580-
.. code-block:: xml
581-
582-
<!-- config/services_test.xml -->
583-
<?xml version="1.0" encoding="UTF-8" ?>
584-
<container xmlns="http://symfony.com/schema/dic/services"
585-
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
586-
xsi:schemaLocation="http://symfony.com/schema/dic/services
587-
https://symfony.com/schema/dic/services/services-1.0.xsd">
554+
public function testSomething()
555+
{
556+
$client = self::createClient();
557+
$container = $client->getContainer();
558+
// $someService = $container->get('the-service-ID');
588559

589-
<services>
590-
<!-- ... -->
560+
// ...
561+
}
591562

592-
<service id="test.App\Test\SomeTestHelper" alias="App\Test\SomeTestHelper" public="true"/>
593-
</services>
594-
</container>
563+
Symfony tests also have access to a special container that includes both the
564+
public services and the non-removed :ref:`private services <container-public>`
565+
services::
595566

596-
.. code-block:: php
567+
public function testSomething()
568+
{
569+
// this call is needed; otherwise the container will be empty
570+
self::bootKernel();
597571

598-
// config/services_test.php
599-
namespace Symfony\Component\DependencyInjection\Loader\Configurator;
572+
$container = self::$container;
573+
// $someService = $container->get('the-service-ID');
600574

601-
use App\Service\MessageGenerator;
602-
use App\Service\SiteUpdateManager;
575+
// ...
576+
}
603577

604-
return function(ContainerConfigurator $configurator) {
605-
// ...
578+
Finally, for the most rare edge-cases, Symfony includes a special container
579+
which provides access to all services, public and private. This special
580+
container is a service that can be get via the normal container::
606581

607-
$services->alias('test.App\Test\SomeTestHelper', 'App\Test\SomeTestHelper')->public();
608-
};
582+
public function testSomething()
583+
{
584+
$client = self::createClient();
585+
$normalContainer = $client->getContainer();
586+
$specialContainer = $normalContainer->get('test.service_container');
609587

610-
.. tip::
588+
// $somePrivateService = $specialContainer->get('the-service-ID');
611589

612-
The special container that gives access to private services exists only in
613-
the ``test`` environment and is itself a service that you can get from the
614-
real container using the ``test.service_container`` id.
590+
// ...
591+
}
615592

616593
.. tip::
617594

0 commit comments

Comments
 (0)