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
Post a Comment