Symfony 4.1: Teste de Serviço Simplicado
Todos os serviços tornaram-se privados por padrão no Symfony 3.4, o que significa que não é mais possível chamar $this->get('my_service_id')
nos controladores para obter rapidamente algum serviço.
Essa mudança foi feita porque usar o container de serviço diretamente não é considerado uma boa prática pois esconde as dependências de suas classes, tornando-as acopladas a configuração externa, dificultando testes e revisões.
Sempre que um recurso como esse é removido, é fornecida uma alternativa que é considerada melhor e, se possível, tão simples de usar como a anterior. É por isso que os controladores permitem a injeção de serviços com type hints em seus métodos de ação e em seus construtores.
A única desvantagem restante de “serviços privados por padrão” é que o teste ficou mais difícil do que antes. Alguns desenvolvedores até definiram alguma configuração no ambiente de teste para tornar todos os serviços públicos em testes. No Symfony 4.1, fizemos o mesmo e agora os testes permitem trazer serviços privados por padrão.
Na prática, os testes com base em WebTestCase
e KernelTestCase
agora acessam um container especial através de $client->getContainer()
ou da propriedade static::$container
que permite trazer serviços privados não removidos:
use App\Entity\User;
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
use Symfony\Component\Console\Tester\CommandTester;
class AddUserCommandTest extends KernelTestCase
{
private function assertUserCreated()
{
self::bootKernel();
// returns the real and unchanged service container
$container = self::$kernel->getContainer();
// returns the special container that allows fetching private services
$client = static::createClient();
$container = $client->getContainer();
// alternative way to get the special container:
// $container = self::$container;
$user = self::$container->get('doctrine')->getRepository(User::class)->findOneByEmail('...');
$this->assertTrue(self::$container->get('security.password_encoder')->isPasswordValid($user, '...');
// ...
}
Tradução de: New in Symfony 4.1: Simpler service testing