I want to use Prophecy ("phpspec / prophecy-phpunit") for the first time to create unit tests for my classes. I want to test a function that calls another function in the same service, here is the code:
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); }
The first problem I ran into was that I used findOneByUsername , and Prophecy, as far as I know, does not allow: mock magic methods ( _call for EntityRepository ), false methods that do not exist, scoff at the class you are testing . If this is true, I have a little pickle, that is, I can not check this function without testing other functions in the class.
So far, my test is as follows:
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); } }
And, of course, the tests fail because promises on $em and the repository fails. If I create an instance of the class that I am testing, the tests fail because the function then calls createUserFromLdap() in the same class and is not being tested.
Any suggestions?
source share