Как смоделировать метод из класса, который вы тестируете, с помощью Prophecy?Php

Кемеровские программисты php общаются здесь
Anonymous
Как смоделировать метод из класса, который вы тестируете, с помощью Prophecy?

Сообщение Anonymous »

Я хочу впервые использовать Prophecy («phpspec/prophecy-phpunit») для создания модульных тестов для моих классов. Я хочу протестировать функцию, которая вызывает другую функцию в том же сервисе, вот код:

Код: Выделить всё

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);
}
Первая проблема, с которой я столкнулся, заключалась в том, что я использовал findOneByUsername, и Prophecy, насколько мне известно, не позволяет вам: издеваться над магическими методами ( для EntityRepository), имитируйте несуществующие методы, имитируйте тестируемый класс. Если это правда, то я в затруднительном положении, то есть я не могу протестировать эту функцию, не проверив другие функции в классе.

Пока мой тест выглядит так:

Код: Выделить всё

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);
}
}
И, конечно же, тесты проваливаются, потому что обещания по $em и репозиторию не выполняются. Если я создаю экземпляр класса, который тестирую, тесты завершаются неудачей, потому что функция затем вызывает createUserFromLdap() для того же класса, и он не тестируется.

Есть предложения?

Подробнее здесь: https://stackoverflow.com/questions/280 ... h-prophecy

Вернуться в «Php»