Doctrine orm 如何使用PHPUnit在Zend Framework 3中模拟条令存储库
我正在尝试测试一个ZF3控制器操作,在这个过程中,该操作使用作为GET参数的令牌,通过Doctrine ORM存储库从数据库中选择一个用户。因为我需要确保用户存在,所以我需要创建一个返回用户对象的存储库的模拟。我该怎么做 我的设置如下所示: 类UserControllerFactory正在实例化UserController类: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
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);