热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何使用Prophecy来测试您正在测试的类中的方法?

如何解决《如何使用Prophecy来测试您正在测试的类中的方法?》经验,请问有没有懂的朋友?

我想第一次使用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和预言,据我所知,不允许你:模拟魔术方法(_callfor 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()同一个类并且未经过测试.

有什么建议?


推荐阅读
author-avatar
初来乍到1231
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有