Symfony 4.1: Teste de Serviço Simplicado

Andréia Bohner
2 min readMar 21, 2018

--

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

--

--