如何使用PHPUnit

时间:2017-02-11 14:39:46

标签: doctrine-orm phpunit zend-framework3

我正在尝试测试ZF3控制器操作,该操作在此过程中使用作为GET参数给出的令牌通过Doctrine ORM存储库从数据库中选择用户。因为我需要确保User存在,我需要创建一个返回用户对象的存储库的模拟。我该怎么做?

我的设置如下:

UserControllerFactory类正在实例化UserController类:

class UserControllerFactory implements FactoryInterface {

/**
 * @param ContainerInterface $container Zend\ServiceManager\ServiceManager
 * @param string             $requestedName
 * @param array|NULL         $options
 *
 * @return UserController
 */
public function __invoke(ContainerInterface $container, $requestedName, Array $options = NULL) {
    $entityManager         = $container->get('doctrine.entitymanager.orm_default');
    $userRepository        = $entityManager->getRepository('User\Entity\User');

    return new UserController($container, $entityManager, $userRepository);
}}

在UserController中调用acton resetPassword。它从路径获取所需参数,并从匹配令牌的数据库中选择用户:

public function resetPasswordAction(){         $ request = $ this-> getRequest();

    $passwordResetToken = $this->params()->fromRoute('token');
    if(strlen(trim($passwordResetToken))) {
        $user = $this->userRepository->findOneBy(
            [
                'passwordResetToken' => $passwordResetToken
            ]
        );
...

如果找不到用户。该操作将重定向到用户以执行其他操作。

PHPUnit测试用例:

public function testResetPasswordActionCanBeAccessed() {
    $passwordResetToken = 'testToken1234';

    $this->dispatch("/user/resetPassword/$passwordResetToken", 'GET');
    $this->assertNotRedirect();
}

由于没有用户拥有令牌,因此将被重定向。

据我所知,我需要创建存储库的模拟(userRepository),创建模拟用户并使用模拟存储库检索具有该令牌的模拟用户。

我不确定这是不是正确的approche,因为我尝试了很多教程,但从未让它工作。我不知道如何替换"在名为" userRepository"的动作中用单元测试创​​建模拟对象。

如果需要,我很乐意提供更多详细信息。

修改

根据@DonCallisto(谢谢)的建议,我将测试用例代码更改为:

    ...
    $mockedEm = $this->createMock(EntityManager::class);
    $mockedUserRepository = $this->createMock('Core\Repository\EntityRepository');
    $mockedEm->method('getRepository')->willReturn($mockedUserRepository);
    $mockedUserRepository->method('findOneBy')->willReturn($mockedUser);

    $this->dispatch("/$this->_lang/user/resetPassword/$passwordResetToken", 'GET');
    ...

但在致电"发送"在测试用例中我的控制器调用

$user = $this->userRepository->findOneBy(...)

仍将返回NULL而不是测试中给出的模拟用户对象。如果我调试$ mockedUserRepository,我的$ mockedUser被正确分配。

我也尝试了建议:

$mockedUserRepository->findOneBy([arrayWithParams])->willReturn($mockedUser);

但是这会因为$ mockedUserRepository-> findOneBy()返回NULL而导致错误。

0 个答案:

没有答案