我正在尝试测试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而导致错误。