symfony - Test Doctrine ODM respository with phpunit in Symfony2 -


i want test simple query:

public function findarticlesbyusers($ids) {      $qb = $this->createquerybuilder();     $qb             ->addor($qb->expr()->field('creator.id')->in($ids))             ->addor($qb->expr()->field('modifier.id')->in($ids))             ->addor($qb->expr()->field('publisher.id')->in($ids));      $query = $qb->getquery();     $results = $query->execute();      return $results; } 

where creator, modifier , publisher can differents user.

i'm following example of symfony doc: http://symfony.com/doc/current/cookbook/testing/database.html#mocking-the-repository-in-a-unit-test

how test query builder?. code this:

public function testfindarticlesbyusers() {     $article = $this->getmock('\acme\demobundle\document\article');     $article->expects($this->once())         ->method('getcreator')         ->will($this->returnvalue($this->getmock('\acme\demobundle\document\\user')));     $article->expects($this->once())         ->method('getmodifier')         ->will($this->returnvalue($this->getmock('\acme\demobundle\document\\user')));     $article->expects($this->once())         ->method('getpublisher')         ->will($this->returnvalue($this->getmock('\acme\demobundle\document\\user')));      $articlerepository = $this->getmockbuilder('\doctrine\odm\documentrepository')         ->setmethods(array('findarticlesbyusers'))         ->disableoriginalconstructor()         ->getmock();     $articlerepository->expects($this->once())         ->method('findarticlesbyusers')         ->will($this->returnvalue($article));      $documentmanager = $this->getmockbuilder('\doctrine\common\persistence\objectmanager')         ->disableoriginalconstructor()         ->getmock();     $documentmanager->expects($this->once())         ->method('getrepository')         ->will($this->returnvalue($articlerepository));      $article2 = $documentmanager->getrepository('backendbundle:article')         ->findarticlesbyusers(1); } 

i haven't idea continuous , if correct way. error is:

expectation failed method name equal <string:getcreator> when invoked 1 time(s). method expected called 1 times, called 0 times. 

but i'm not sure how test , check result.

update:

i changed code pass test(ok, it's green) me test doesn't work fine because although delete findarticlesbyusers method test green. i'm doing wrong?

public function testfindarticlesbyusers() {     $usercreator = $this->getmock('\tt\backendbundle\document\user');     $usercreator->expects($this->any())         ->method('getid')         ->will($this->returnvalue(1));      $usermodifier = $this->getmock('\tt\backendbundle\document\user');     $usermodifier->expects($this->any())         ->method('getid')         ->will($this->returnvalue(2));      $userpublisher = $this->getmock('\tt\backendbundle\document\user');     $userpublisher->expects($this->any())         ->method('getid')         ->will($this->returnvalue(3));      //article mock     $article = $this->getmock('\tt\backendbundle\document\article');     $article->expects($this->once())         ->method('getcreator')         ->will($this->returnvalue($usercreator));     $article->expects($this->once())         ->method('getmodifier')         ->will($this->returnvalue($usermodifier));     $article->expects($this->once())         ->method('getpublisher')         ->will($this->returnvalue($userpublisher));      $articlerepository = $this->getmockbuilder('\doctrine\odm\documentrepository')         ->setmethods(array('findarticlesbyusers'))         ->disableoriginalconstructor()         ->getmock();     $articlerepository->expects($this->once())         ->method('findarticlesbyusers')         ->will($this->returnvalue($article));      $documentmanager = $this->getmockbuilder('\doctrine\common\persistence\objectmanager')         ->disableoriginalconstructor()         ->getmock();     $documentmanager->expects($this->once())         ->method('getrepository')         ->will($this->returnvalue($articlerepository));      $article = $documentmanager->getrepository('backendbundle:article')         ->findarticlesbyusers(1);      $this->assertequals(1, $article->getcreator()->getid());     $this->assertequals(2, $article->getmodifier()->getid());     $this->assertequals(3, $article->getpublisher()->getid()); } 

update2:

i think understand mock object :) doing above i'm mocking repository isn't objetive. last code test method is:

public function testfindarticlesbyusers() {     $userid = $this->dm->createquerybuilder('acmebundle:user')                               ->field('username')->equals('fakeuser')                               ->getquery()->getsingleresult()->getid();      $articles = $this->dm->getrepository('acmebundle:article')         ->findarticlesbyusers(array($userid));      $this->assertgreaterthanorequal(1, count($articles)); } 

the test works although depends on of user exists , has articles. ok test?


Comments