Desidero utilizzare Prophecy ("phppec/prophecy-phpunit") per la prima volta per creare test di unità per le mie classi. Voglio testare una funzione che chiama un'altra funzione nello stesso servizio, ecco il codice:Come prendere in giro un metodo dalla classe che si sta testando con Prophecy?
class UserManager
{
private $em;
private $passwordHelper;
public function __construct(\Doctrine\ORM\EntityManager $em, \MainBundle\Helper\PasswordHelper $passwordHelper)
{
$this->em = $em;
$this->passwordHelper = $passwordHelper;
}
public function getUserForLdapLogin($ldapUser)
{
$dbUser = $this
->em
->getRepository('MainBundle:User')
->findOneBy(array('username' => $ldapUser->getUsername()));
return (!$dbUser) ?
$this->createUserFromLdap($ldapUser) :
$this->updateUserFromLdap($ldapUser, $dbUser);
}
primo problema che ho avuto è stata che mi stava usando findOneByUsername
e profezia, per quanto riguarda la mia conoscenza va, non si consente per: simulare metodi magici (_call
per EntityRepository
), metodi fittizi che non esistono, prendere in giro la classe che si sta testando. Se questi sono veri, sono un po 'sottaceto, ovvero non posso testare questa funzione senza testare le altre funzioni della classe.
Finora, la mia prova assomiglia a questo:
class UserManagerTest extends \Prophecy\PhpUnit\ProphecyTestCase
{
public function testGetUserForLdapLoginWithNoUser()
{
$ldapUser = new LdapUser();
$ldapUser->setUsername('username');
$em = $this->prophesize('Doctrine\ORM\EntityManager');
$passwordHelper = $this->prophesize('MainBundle\Helper\PasswordHelper');
$repository = $this->prophesize('Doctrine\ORM\EntityRepository');
$em->getRepository('MainBundle:User')->willReturn($repository);
$repository->findOneBy(array('username' => 'username'))->willReturn(null);
$em->getRepository('MainBundle:User')->shouldBeCalled();
$repository->findOneBy(array('username' => 'username'))->shouldBeCalled();
$service = $this->prophesize('MainBundle\Helper\UserManager')
->willBeConstructedWith(array($em->reveal(), $passwordHelper->reveal()));
$service->reveal();
$service->getUserForLdapLogin($ldapUser);
}
}
E, naturalmente, i test falliscono perché le promesse su $em
, e il repository non sono soddisfatte. Se istanziato la classe che sto testando, i test falliscono perché la funzione chiama quindi sulla stessa classe e non è testata.
Qualche suggerimento?
Non l'ho mai usato, quindi non posso aiutare me stesso.Tuttavia, se si è ancora bloccato in un paio di giorni (vale a dire quando una taglia questione può essere applicata), mi ping con @halfer e io aggiungerne uno. Buona domanda! – halfer
risposta migliore che ho trovato finora è che la classe probabilmente non seguire i principi S.O.L.I.D e non ha una sola responsabilità. Quindi fai in modo che la tua classe sia dritta prima di provare a usare la profezia. – anegrea