2017-03-06 3 views
0

Je coder un test PHPUnit et a obtenu ce faudronttests PHPUnit avec ZF2 Paginator

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

Pour obtenir un peu plus d'informations quand quelque chose va mal dans un cas de test, je le paramétre traceError protégée $ vrai. Et puis obtenu cette erreur:

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 

Cela se produit parce que ma requête retourne un objet Paginator et mon test attend un tableau. Comment est-ce que j'instancie un pagination simulé pour l'utiliser dans mon test?

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

intérieur de mon contrôleur:

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

Fonction dans mon dépôt:

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

Vous feriez mieux de poster votre code si vous voulez que quelqu'un vous aide. – feedMe

+0

Merci @feedMe, j'ai mis à jour ma question. –

+0

Aucun indice sur votre test, mais avoir votre référentiel dans vos contrôleurs est mauvais au sujet des meilleures pratiques MVC. C'est juste un conseil à prendre tel quel :) – Hooli

Répondre

0

j'ai réussi à résoudre ce problème. Ici, il va le code, comment simuler un objet 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); 
}