如何在不对数据库执行查询的情况下编写存储库测试
How to write repository test without executing query on db
我花了很多时间尝试为我的存储库功能创建适当的 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
有人能帮我解决一下,如何编写测试,测试我的存储库功能,而不连接到数据库并执行任何查询。如果您需要任何其他信息,请告诉我,我会提供!谢谢!
我已经为我的案例找到了解决方案。如果有人需要它,这就是我的测试的样子
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');
}
我花了很多时间尝试为我的存储库功能创建适当的 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
有人能帮我解决一下,如何编写测试,测试我的存储库功能,而不连接到数据库并执行任何查询。如果您需要任何其他信息,请告诉我,我会提供!谢谢!
我已经为我的案例找到了解决方案。如果有人需要它,这就是我的测试的样子
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');
}