Как написать тест репозитория без выполнения запроса на БД - PullRequest
0 голосов
/ 06 декабря 2018

Я потратил часть своего часа, пытаясь создать правильный тест 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 Ответ

0 голосов
/ 07 декабря 2018

Я нашел решение для моего случая.Если это нужно любому организму, вот как выглядит мой тест

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');
}
...