dqifn68206 2017-03-06 17:18
浏览 79
已采纳

使用ZF2 Paginator进行phpUnit测试

I'm coding a phpUnit test and got this fail:

Tests\Professor\Controller\DisciplinaControllerTest::testListaDisciplinas
Failed asserting response code "200", actual status code is "500"

To get a bit more information when something goes wrong in a test case, I set the protected $traceError member to true. And then got this error:

Tests\Professor\Controller\DisciplinaControllerTest::testListaDisciplinas
Argument 1 passed to Doctrine\ORM\Tools\Pagination\Paginator::cloneQuery() must be an instance of Doctrine\ORM\Query, array given, called in /uov-videos/www/david/plataovirtual/vendor/doctrine/orm/lib/Doctrine/ORM/Tools/Pagination/Paginator.php on line 239 and defined

This is happening because my query returns an Paginator object and my test is expecting an array. How do I instantiate a mocked Paginator to use it in my test?

phpUnit function code:

public function testListaDisciplinas()
{
    $this->auth();
    // simulate the repository to not affect the db
    $disciplinaRepository = $this->getMock('Domain\Model\Disciplina\DisciplinaRepository');

    $disciplinaRepository->method('getByProfessorTutor')
                         ->willReturn(array());

    $serviceManager = $this->getApplicationServiceLocator();
    $serviceManager->setAllowOverride(true);
    $serviceManager->setService('DisciplinaRepository', $disciplinaRepository);

    // Route to getList() above
    $result = $this->dispatch('/uov/professor/disciplinas');
    $this->assertResponseStatusCode(200);
}

Inside my Controller:

public function getList()
{
    $usuario = $this->getSessaoUsuario();

    $professor = $this->professorRepository()->getByUsuario($usuario);

    $disciplinas = $this->disciplinaRepository()->getByProfessorTutor($professor);

    $adapter = new DoctrinePaginator($disciplinas);
    $paginator = new Paginator($adapter);
    $paginator->setDefaultItemCountPerPage(20);

    $view = new ViewModel(array(
        'disciplinas' => $paginator,
    ));

    $request = $this->getRequest();

    $view->setTerminal($request->isXmlHttpRequest());

    return $view;
}

Function inside my repository:

public function getByProfessorTutor(Professor $professor)
{
    $query = $this->em->createQueryBuilder();

    $query->select('d')
          ->from($this->class, 'd')
          ->leftJoin('Domain\Model\Turma\Turma', 't', 'WITH', 't.disciplina = d')
          ->leftJoin('Domain\Model\Professor\ProfessorTurma', 'pt', 'WITH', 'pt.turma = t.id')
          ->where('(t.professor = :professor OR pt.professor = :professor)')
          ->setParameter('professor', $professor);

    return new Paginator($query, $fetchJoinCollection = false);
}
  • 写回答

1条回答 默认 最新

  • doujiang1939 2017-03-09 13:43
    关注

    I managed to solve this problem. Here it goes the code, how to simulate a Doctrine Paginator object.

    public function testListaDisciplinas()
    {
        $this->auth();
        // simulate the repository to not modify the db
        $disciplinaRepository = $this->getMock('Domain\Model\Disciplina\DisciplinaRepository');
    
        $em = $this->getApplicationServiceLocator()->get('Doctrine\ORM\EntityManager');
    
        $query = $em->createQueryBuilder();
        $query->select('d')
              ->from('Domain\Model\Disciplina\Disciplina', 'd')
              ->setMaxResults(1);
    
        $disciplinaRepository->method('getByProfessorTutor')
                             ->willReturn(new Paginator($query, $fetchJoinCollection = false));
    
        $serviceManager = $this->getApplicationServiceLocator();
        $serviceManager->setAllowOverride(true);
        $serviceManager->setService('DisciplinaRepository', $disciplinaRepository);
        $result = $this->dispatch('/uov/professor/disciplinas');
        $this->assertResponseStatusCode(200);
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?
  • ¥15 让node服务器有自动加载文件的功能
  • ¥15 jmeter脚本回放有的是对的有的是错的