Doctrine orm 如何使用PHPUnit在Zend Framework 3中模拟条令存储库

Doctrine orm 如何使用PHPUnit在Zend Framework 3中模拟条令存储库,doctrine-orm,phpunit,zend-framework3,Doctrine Orm,Phpunit,Zend Framework3,我正在尝试测试一个ZF3控制器操作,在这个过程中,该操作使用作为GET参数的令牌,通过Doctrine ORM存储库从数据库中选择一个用户。因为我需要确保用户存在,所以我需要创建一个返回用户对象的存储库的模拟。我该怎么做 我的设置如下所示: 类UserControllerFactory正在实例化UserController类: class UserControllerFactory implements FactoryInterface { /** * @param ContainerInt

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

我的设置如下所示:

类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。它从路由中获取所需的参数,并从与令牌匹配的数据库中选择一个用户:

公共函数resetPasswordAction(){ $request=$this->getRequest()

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

PHPUnit测试用例:

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

    $this->dispatch("/user/resetPassword/$passwordResetToken", 'GET');
    $this->assertNotRedirect();
}
由于没有用户拥有令牌,因此将重定向

据我所知,我需要创建一个存储库的mock(userRepository),创建一个mock用户并使用mock存储库检索拥有令牌的mock用户

我不确定这是否是正确的方法,因为我尝试了很多教程,但都没有成功。我不知道如何用单元测试中创建的模拟对象“替换”名为“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');
    ...
但是在测试用例中调用“dispatch”之后,我的控制器调用

$user = $this->userRepository->findOneBy(...)
仍将返回NULL,而不是测试中给定的模拟用户对象。如果调试$mockedUserRepository,将正确分配$mockedUser

我还尝试了以下建议:

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

但由于$mockedUserRepository->findOneBy()返回NULL,这将通过一个错误实现。

几秒钟前我已经回答了一个类似的问题:
$mockedUserRepository->findOneBy([arrayWithParams])->willReturn($mockedUser);