Bonjour,
Voila je rencontre un petit problème avec mon code.
J'essaie de tester un service qui a 6 dépendances dont (requeststack et jms serializer). La création des mock est un vrai calvaire. Je me retrouve avec plus de lignes de test que de lignes de code et si ca continue, je pense que j'aurais besoin de tester mes tests. Pour une si petite application, je trouve assez lourd.
Je cherche une méthode d'organisation permettant d'écrire le minimum de tests, notamment en ce qui concerne la création de données de test (dataprovider et cie ... ). Et dans la mesure du possible, j'aimerais utilsier les vrais fonctions de mes dépendances.
Par ex, concernant jms_serializer, j'aimerais utiliser les vrais fonctions de/serialize() plutôt que les mocks car plusieurs fonctions en dépendent. La création de jeux de données avec @dataProvider est juste un calvaire.
J'aimerais savoir si il y a un moyen simple pour tester un service Symfony qui a des dépendances.
Je me retrouve avec des configurations un peu compliquées ou si ca continue j'en arriverai au point de devoir tester mes tests :(
Voici un bout de ma classe de test
namespace Blixit\MSFBundle\Tests\Form\Type;
use Blixit\MSFBundle\Core\MSFService;
use Blixit\MSFBundle\Entity\MSFDataLoader;
use Blixit\MSFBundle\Form\Type\MSFBaseType;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
use Doctrine\ORM\EntityManager;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Routing\Router;
use JMS\Serializer\Serializer;
class FakeType
extends MSFBaseType{
public function configure()
{
return [
'__root' => 'FAKEROOT',
'fake_state'=>[
'entity' => FakeType::class
]
];
}
}
class MSFBaseTypeTest extends WebTestCase
{
/**
* @var MSFService
*/
private $msf;
private $faketype;
public function setUp() {
$client = $this->createClient();
$client->request('POST','/msfbundle',['parameters']);
$request = $client->getRequest();
$session = $client->getRequest()->getSession();
$requestStack = $this->getMockBuilder(RequestStack::class)->getMock();
$requestStack->method('getCurrentRequest')->willReturn($request);
$router = $this->getMockClass(Router::class);
//$serializerClass = $this->getMockClass(Serializer::class);
$serializer = $this->getMockBuilder(Serializer::class)->disableOriginalConstructor()->getMock();
$serializer->method('serialize')->withAnyParameters()->willReturn([]);
$serializer->method('deserialize')->withAnyParameters()->willReturn(new MSFDataLoader());
$entityManager = $this->getMockClass(EntityManager::class);
$container = $this->getMockBuilder("Symfony\Component\DependencyInjection\ContainerInterface")
->getMock();
$this->msf = $this->getMockBuilder(MSFService::class)
->disableOriginalConstructor()
->getMock();
$this->msf
->method('getRequestStack')
->willReturn($requestStack);
$this->msf
->method('getSession')
->willReturn($session);
$this->msf
->method('getSerializer')
->willReturn($serializer);
$this->msf
->method('create')
->with(FakeType::class)
->willReturn(new FakeType($this->msf,'fake_state'));
$this->faketype = $this->msf->create(FakeType::class);
}
public function testconfigure()
{
$faketype = $this->faketype;
$this->assertTrue($faketype->configuration['__root'] == 'FAKEROOT', "default configuration for '__root' not erased.");
if (!$this->msf->getSession()->has('__msf_dataloader')){
$this->assertTrue($faketype->getMsfDataLoader()->getState() == 'fake_state', "default state not erased");
}
$configuration = $faketype->getConfiguration();
$this->assertArrayHasKey('fake_state',$configuration);
$this->assertSame($faketype->getMsfDataLoader()->getState(),'fake_state');
}