簡體   English   中英

使用ZF2 Paginator進行phpUnit測試

[英]phpUnit testing with ZF2 Paginator

我正在編碼phpUnit測試,但失敗了:

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

為了在測試案例中出現問題時獲得更多信息,我將受保護的$ traceError成員設置為true。 然后得到這個錯誤:

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

發生這種情況是因為我的查詢返回了一個Paginator對象,而我的測試需要一個數組 如何實例化模擬的Paginator以在測試中使用它?

phpUnit函數代碼:

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);
}

在我的控制器內部:

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;
}

我的存儲庫中的功能:

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);
}

我設法解決了這個問題。 這里是代碼,如何模擬Doctrine Paginator對象。

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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM