首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用queryBuilder测试在symfony2上使用PhpUnit的管理器方法

如何使用queryBuilder测试在symfony2上使用PhpUnit的管理器方法
EN

Stack Overflow用户
提问于 2017-01-31 20:03:01
回答 2查看 1.1K关注 0票数 1

这是我想在管理器(族谱Manager.php)上测试的函数,当我运行phpunit命令时,它会产生以下错误:

在第77行的/home/majri/Documents/projects/IadDirectoryApp/vendor/iad-holding/genealogy-bundle/Iad/Bundle/GenealogyBundle/Manager/GenealogyManager.php中调用null上的成员函数getSingleScalarResult()

代码语言:javascript
复制
  /**
 * @param Genealogy $genealogy
 * @return mixed
 */
public function getCountManagerialLevelsByGenealogy(Genealogy $genealogy)
{
    $qb = $this->getRepository()->createQueryBuilder('gen');
    $qb->select('count(distinct(gen.level))') 
        ->where($qb->expr()->lt('gen.right', $genealogy->getRight()))
        ->andWhere($qb->expr()->gt('gen.left', $genealogy->getLeft()))
    ; 
    return $qb->getQuery()->getSingleScalarResult();
}

**我的单元测试功能**

代码语言:javascript
复制
 public function testGetCountManagerialLevelsByGenealogy()
{
    $em =  $this->getMockBuilder(EntityManager::class)
        ->disableOriginalConstructor()
        ->getMock();

    $repository = $this->getMockBuilder(EntityRepository::class)
        ->disableOriginalConstructor()
        ->getMock();

    $em->expects($this->once())
        ->method('getRepository')
        ->with('IadGenealogyBundle:Genealogy')
        ->will($this->returnValue($repository));

    $queryBuilder = $this->getMockBuilder(QueryBuilder::class)
        ->setMethods(['select','where','setParameter','getQuery'])
        ->disableOriginalConstructor()
        ->getMock();

    $repository->expects($this->once())
        ->method('createQueryBuilder')
        ->with('gen')
        ->will($this->returnValue($queryBuilder));

    $queryBuilder->expects($this->at(0))
        ->method('select')
        ->will($this->returnValue($queryBuilder));

    $queryBuilder->expects($this->at(1))
        ->method('where')
        ->will($this->returnValue($queryBuilder));

    $queryBuilder->expects($this->at(2))
        ->method('setParameter')
        ->will($this->returnValue($queryBuilder));

    $getQuery =  $this->getMockBuilder('\Doctrine\ORM\AbstractQuery')
        ->setMethods(array('setParameter', 'getSingleScalarResult'))
        ->disableOriginalConstructor()
        ->getMockForAbstractClass();


    $getQuery->expects($this->once())
        ->method('setParameter')
        ->will($this->returnValue($queryBuilder));

    $getQuery->expects($this->any())
        ->method('getSingleScalarResult')
        ->will($this->returnValue(3));

    $queryBuilder->expects($this->at(3))
        ->method('getQuery')
        ->will($this->returnValue($getQuery));


    $genealogyManager = new GenealogyManager($em);

    $this->assertEquals(3, $genealogyManager->getCountManagerialLevelsByGenealogy($this->buildMockGenealogy(9)));
}
EN

回答 2

Stack Overflow用户

发布于 2017-02-01 07:09:07

我不确定这是否是唯一的错误,但是您的查询需要正确地设置参数,如下所示:

代码语言:javascript
复制
$qb->select('count(distinct(gen.level))') 
    ->where($qb->expr()->lt('gen.right', ':getRight'))
    ->andWhere($qb->expr()->gt('gen.left', ':getLeft'))
    ->setParameters(array(
        'genRight' => $genealogy->getRight(),
        'genLeft' => $genealogy->getLeft()
    ))
; 
票数 0
EN

Stack Overflow用户

发布于 2019-01-16 17:46:26

在我看来,您似乎忘记了模拟andWhere方法(因此返回null)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41966502

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档