代码之家  ›  专栏  ›  技术社区  ›  Valor_ user3379466

如何在不对数据库执行查询的情况下编写存储库测试

  •  0
  • Valor_ user3379466  · 技术社区  · 6 年前

    我花了很多时间试图为我的存储库功能创建一个合适的phpunit测试,但仍然没有成功,所以我要求助于你们。

    我正在尝试编写一个测试,它正在测试我的存储库功能,而不连接到数据库。

    我有这个储存库功能(symfony 4)

    class RequestRepository extends EntityRepository
    {
       public function getCompletedRequestByName($name)
            {
                $requestsStatuses = $this->createQueryBuilder('r')
                    ->join('r.domains', 'd', Join::WITH, 'r.id = d.request')
                    ->where('r.name = :name')
                    ->andWhere('r.status = :completed')
                    ->setParameter('name', $name)
                    ->setParameter('completed', 'COMPLETED')
                    ->getQuery()
                    ->getOneOrNullResult();
                return $requestsStatuses;
            }
    }
    

    这是我的测试

    public function testGetCompletedRequestByName()
    {
        $entityM =
            $this->getMockBuilder(EntityManagerInterface::class)
                ->disableOriginalConstructor()
                ->getMockForAbstractClass();
    
        $classMetaData =
            $this->getMockBuilder(ClassMetadata::class)
                ->disableOriginalConstructor()
                ->getMockForAbstractClass();
    
        $repo = new RequestRepository($entityM, $classMetaData);
        var_dump($repo->getCompletedRequestByName('antrax.com'));
        die();
    }
    

    我得到的错误是

    1) App\Repository\RequestRepositoryTest::testGetCompletedRequestByName
    Error: Call to a member function select() on null
    

    有人能帮我吗?如何写一个测试,测试我的存储库功能,而不连接到数据库和执行任何查询。如果您需要任何其他信息,请让我知道,我将提供!谢谢您!

    1 回复  |  直到 6 年前
        1
  •  0
  •   Valor_ user3379466    6 年前

    我为我的案件找到了解决办法。如果有人需要的话,这就是我测试的样子

    public function testGetCompletedRequestByName()
    {
    
        $queryBuilder = $this->getMockBuilder(QueryBuilder::class)->disableOriginalConstructor()
            ->setMethods(['setParameter', 'getQuery', 'getOneOrNullResult', 'join', 'andWhere', 'where'])->getMock();
    
        $queryBuilder->method('getQuery')->willReturnSelf();
    
        $queryBuilder->method('setParameter')->willReturnCallback(function ($field, $value) use ($queryBuilder){
            if ($field == 'name') {
                $this->assertSame('antrax.com', $value);
            } elseif ($field == 'completed') {
                $this->assertSame('COMPLETED', $value);
            }
            return $queryBuilder;
        });
    
        $queryBuilder->method('join')->willReturnCallback(function ($field, $alias, $operator, $cond) use ($queryBuilder){
    
            $this->assertSame('r.domains', $field);
            $this->assertSame('d', $alias);
            $this->assertSame(Join::WITH, $operator);
            $this->assertSame('r.id = d.request', $cond);
    
            return $queryBuilder;
        });
    
        $queryBuilder->method('where')->willReturnCallback(function ($cond) use ($queryBuilder){
    
            $this->assertSame('r.name = :name', $cond);
            return $queryBuilder;
        });
    
        $queryBuilder->method('andWhere')->willReturnCallback(function ($cond) use ($queryBuilder){
    
            $this->assertSame('r.status = :completed', $cond);
            return $queryBuilder;
        });
    
        $repositoryMock =
            $this->getMockBuilder(RequestRepository::class)->disableOriginalConstructor()
                ->setMethods(['createQueryBuilder'])->getMock();
    
        $repositoryMock->method('createQueryBuilder')->willReturnCallback(function ($alias) use ($queryBuilder){
            $this->assertSame('r', $alias);
            return $queryBuilder;
        });
    
        $repositoryMock->getCompletedRequestByName('antrax.com');
    }