用于测试的 Symfony 模拟存储库
Symfony mocking repository for testing
我正在尝试模拟一个包含所有模块的存储库,它有一个名为 findAll() 的方法 returns 来自该存储库的所有元素。我似乎无法从模拟存储库中提取任何数据。有什么办法可以解决吗?
模拟存储库:
$moduleRepository = $this->createMock(ModuleRepository::class);
尝试使用 ModuleRepository class 中调用 findAll() 的方法,returns 数组中存储库中的所有元素。
$moduleRepository->expects($this->any())
->method('findAll')
->willReturn([]);
这就是我打印 $moduleRepository 时得到的结果:
Mock_ModuleRepository_f6bead1c Object
(
[_entityName:protected] =>
[_em:protected] =>
[_class:protected] =>
[__phpunit_originalObject:Mock_ModuleRepository_f6bead1c:private] =>
[__phpunit_returnValueGeneration:Mock_ModuleRepository_f6bead1c:private] => 1
[__phpunit_invocationMocker:Mock_ModuleRepository_f6bead1c:private] => PHPUnit\Framework\MockObject\InvocationHandler Object
(
[matchers:PHPUnit\Framework\MockObject\InvocationHandler:private] => Array
(
[0] => PHPUnit\Framework\MockObject\Matcher Object
(
[invocationRule:PHPUnit\Framework\MockObject\Matcher:private] => PHPUnit\Framework\MockObject\Rule\AnyInvokedCount Object
(
[invocations:PHPUnit\Framework\MockObject\Rule\InvocationOrder:private] => Array
(
)
)
[afterMatchBuilderId:PHPUnit\Framework\MockObject\Matcher:private] =>
[afterMatchBuilderIsInvoked:PHPUnit\Framework\MockObject\Matcher:private] =>
[methodNameRule:PHPUnit\Framework\MockObject\Matcher:private] => PHPUnit\Framework\MockObject\Rule\MethodName Object
(
[constraint:PHPUnit\Framework\MockObject\Rule\MethodName:private] => PHPUnit\Framework\MockObject\MethodNameConstraint Object
(
[methodName:PHPUnit\Framework\MockObject\MethodNameConstraint:private] => findAll
[exporter:PHPUnit\Framework\Constraint\Constraint:private] =>
)
)
[parametersRule:PHPUnit\Framework\MockObject\Matcher:private] =>
[stub:PHPUnit\Framework\MockObject\Matcher:private] => PHPUnit\Framework\MockObject\Stub\ReturnStub Object
(
[value:PHPUnit\Framework\MockObject\Stub\ReturnStub:private] => Array
(
)
)
)
)
[matcherMap:PHPUnit\Framework\MockObject\InvocationHandler:private] => Array
(
)
[configurableMethods:PHPUnit\Framework\MockObject\InvocationHandler:private] => Array
(
[0] => PHPUnit\Framework\MockObject\ConfigurableMethod Object
(
[name:PHPUnit\Framework\MockObject\ConfigurableMethod:private] => findAllModuleRoutes
[returnType:PHPUnit\Framework\MockObject\ConfigurableMethod:private] => SebastianBergmann\Type\SimpleType Object
(
[name:SebastianBergmann\Type\SimpleType:private] => array
[allowsNull:SebastianBergmann\Type\SimpleType:private] =>
[value:SebastianBergmann\Type\SimpleType:private] =>
)
)
[1] => PHPUnit\Framework\MockObject\ConfigurableMethod Object
(
[name:PHPUnit\Framework\MockObject\ConfigurableMethod:private] => findAllQueryBuilderWithSearch
[returnType:PHPUnit\Framework\MockObject\ConfigurableMethod:private] => SebastianBergmann\Type\ObjectType Object
(
[className:SebastianBergmann\Type\ObjectType:private] => SebastianBergmann\Type\TypeName Object
(
[namespaceName:SebastianBergmann\Type\TypeName:private] => Doctrine\ORM
[simpleName:SebastianBergmann\Type\TypeName:private] => QueryBuilder
)
[allowsNull:SebastianBergmann\Type\ObjectType:private] =>
)
)
[2] => PHPUnit\Framework\MockObject\ConfigurableMethod Object
(
[name:PHPUnit\Framework\MockObject\ConfigurableMethod:private] => findListResults
[returnType:PHPUnit\Framework\MockObject\ConfigurableMethod:private] => SebastianBergmann\Type\SimpleType Object
(
[name:SebastianBergmann\Type\SimpleType:private] => array
[allowsNull:SebastianBergmann\Type\SimpleType:private] =>
[value:SebastianBergmann\Type\SimpleType:private] =>
)
)
[3] => PHPUnit\Framework\MockObject\ConfigurableMethod Object
(
[name:PHPUnit\Framework\MockObject\ConfigurableMethod:private] => createQueryBuilder
[returnType:PHPUnit\Framework\MockObject\ConfigurableMethod:private] => SebastianBergmann\Type\UnknownType Object
(
)
)
[4] => PHPUnit\Framework\MockObject\ConfigurableMethod Object
(
[name:PHPUnit\Framework\MockObject\ConfigurableMethod:private] => createResultSetMappingBuilder
[returnType:PHPUnit\Framework\MockObject\ConfigurableMethod:private] => SebastianBergmann\Type\UnknownType Object
(
)
)
[5] => PHPUnit\Framework\MockObject\ConfigurableMethod Object
(
[name:PHPUnit\Framework\MockObject\ConfigurableMethod:private] => createNamedQuery
[returnType:PHPUnit\Framework\MockObject\ConfigurableMethod:private] => SebastianBergmann\Type\UnknownType Object
(
)
)
[6] => PHPUnit\Framework\MockObject\ConfigurableMethod Object
(
[name:PHPUnit\Framework\MockObject\ConfigurableMethod:private] => createNativeNamedQuery
[returnType:PHPUnit\Framework\MockObject\ConfigurableMethod:private] => SebastianBergmann\Type\UnknownType Object
(
)
)
[7] => PHPUnit\Framework\MockObject\ConfigurableMethod Object
(
[name:PHPUnit\Framework\MockObject\ConfigurableMethod:private] => clear
[returnType:PHPUnit\Framework\MockObject\ConfigurableMethod:private] => SebastianBergmann\Type\UnknownType Object
(
)
)
[8] => PHPUnit\Framework\MockObject\ConfigurableMethod Object
(
[name:PHPUnit\Framework\MockObject\ConfigurableMethod:private] => find
[returnType:PHPUnit\Framework\MockObject\ConfigurableMethod:private] => SebastianBergmann\Type\UnknownType Object
(
)
)
[9] => PHPUnit\Framework\MockObject\ConfigurableMethod Object
(
[name:PHPUnit\Framework\MockObject\ConfigurableMethod:private] => findAll
[returnType:PHPUnit\Framework\MockObject\ConfigurableMethod:private] => SebastianBergmann\Type\UnknownType Object
(
)
)
[10] => PHPUnit\Framework\MockObject\ConfigurableMethod Object
(
[name:PHPUnit\Framework\MockObject\ConfigurableMethod:private] => findBy
[returnType:PHPUnit\Framework\MockObject\ConfigurableMethod:private] => SebastianBergmann\Type\UnknownType Object
(
)
)
[11] => PHPUnit\Framework\MockObject\ConfigurableMethod Object
(
[name:PHPUnit\Framework\MockObject\ConfigurableMethod:private] => findOneBy
[returnType:PHPUnit\Framework\MockObject\ConfigurableMethod:private] => SebastianBergmann\Type\UnknownType Object
(
)
)
[12] => PHPUnit\Framework\MockObject\ConfigurableMethod Object
(
[name:PHPUnit\Framework\MockObject\ConfigurableMethod:private] => count
[returnType:PHPUnit\Framework\MockObject\ConfigurableMethod:private] => SebastianBergmann\Type\UnknownType Object
(
)
)
[13] => PHPUnit\Framework\MockObject\ConfigurableMethod Object
(
[name:PHPUnit\Framework\MockObject\ConfigurableMethod:private] => __call
[returnType:PHPUnit\Framework\MockObject\ConfigurableMethod:private] => SebastianBergmann\Type\UnknownType Object
(
)
)
[14] => PHPUnit\Framework\MockObject\ConfigurableMethod Object
(
[name:PHPUnit\Framework\MockObject\ConfigurableMethod:private] => getClassName
[returnType:PHPUnit\Framework\MockObject\ConfigurableMethod:private] => SebastianBergmann\Type\UnknownType Object
(
)
)
[15] => PHPUnit\Framework\MockObject\ConfigurableMethod Object
(
[name:PHPUnit\Framework\MockObject\ConfigurableMethod:private] => matching
[returnType:PHPUnit\Framework\MockObject\ConfigurableMethod:private] => SebastianBergmann\Type\UnknownType Object
(
)
)
)
[returnValueGeneration:PHPUnit\Framework\MockObject\InvocationHandler:private] => 1
[deferredError:PHPUnit\Framework\MockObject\InvocationHandler:private] =>
)
)
我这样试过,方法确实被调用了,但是 repo 没有可供它查找的数据。
$moduleRepository->expects($this->any())
->method('findAll')
->willReturn([]);
$myDebugVar = $moduleRepository->findAll();
fwrite(STDERR, print_r($myDebugVar, TRUE));
输出:
Array()
您的 moduleRepository
将始终 return 空数组,因为您说过要这样做。
这里你说 return 一个空数组 []
:
->willReturn([]);
来自方法 findAll
:
->method('findAll')
有一些方法可以处理它,但现在,我建议您创建一个仅用于测试目的的新数据库,然后创建一个新的 .env.test
文件来扩展原始 .env
文件并使用确切的存储库而不是模拟。
# .env.test.local
DATABASE_URL="mysql://USERNAME:PASSWORD@127.0.0.1:3306/DB_NAME?serverVersion=5.7"
namespace App\Tests\Repository;
use Doctrine\ORM\EntityManager;
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
final class SomeTest extends KernelTestCase
{
private ?EntityManager $entityManager;
protected function setUp(): void
{
$kernel = self::bootKernel();
$this->entityManager = $kernel->getContainer()
->get('doctrine')
->getManager();
}
public function testSomething()
{
//given
$moduleRepository = $this->entityManager->getRepository(ModuleRepository::class);
//when
$result = $moduleRepository->findAll(...);
//then
$this->assertEquals(...);
}
protected function tearDown(): void
{
parent::tearDown();
// doing this is recommended to avoid memory leaks
$this->entityManager->close();
$this->entityManager = null;
}
}
确保您将用数据填充新数据库。最好创建固定装置以自动执行此操作并使用 tearDown
方法清理数据库。
我正在尝试模拟一个包含所有模块的存储库,它有一个名为 findAll() 的方法 returns 来自该存储库的所有元素。我似乎无法从模拟存储库中提取任何数据。有什么办法可以解决吗?
模拟存储库:
$moduleRepository = $this->createMock(ModuleRepository::class);
尝试使用 ModuleRepository class 中调用 findAll() 的方法,returns 数组中存储库中的所有元素。
$moduleRepository->expects($this->any())
->method('findAll')
->willReturn([]);
这就是我打印 $moduleRepository 时得到的结果:
Mock_ModuleRepository_f6bead1c Object
(
[_entityName:protected] =>
[_em:protected] =>
[_class:protected] =>
[__phpunit_originalObject:Mock_ModuleRepository_f6bead1c:private] =>
[__phpunit_returnValueGeneration:Mock_ModuleRepository_f6bead1c:private] => 1
[__phpunit_invocationMocker:Mock_ModuleRepository_f6bead1c:private] => PHPUnit\Framework\MockObject\InvocationHandler Object
(
[matchers:PHPUnit\Framework\MockObject\InvocationHandler:private] => Array
(
[0] => PHPUnit\Framework\MockObject\Matcher Object
(
[invocationRule:PHPUnit\Framework\MockObject\Matcher:private] => PHPUnit\Framework\MockObject\Rule\AnyInvokedCount Object
(
[invocations:PHPUnit\Framework\MockObject\Rule\InvocationOrder:private] => Array
(
)
)
[afterMatchBuilderId:PHPUnit\Framework\MockObject\Matcher:private] =>
[afterMatchBuilderIsInvoked:PHPUnit\Framework\MockObject\Matcher:private] =>
[methodNameRule:PHPUnit\Framework\MockObject\Matcher:private] => PHPUnit\Framework\MockObject\Rule\MethodName Object
(
[constraint:PHPUnit\Framework\MockObject\Rule\MethodName:private] => PHPUnit\Framework\MockObject\MethodNameConstraint Object
(
[methodName:PHPUnit\Framework\MockObject\MethodNameConstraint:private] => findAll
[exporter:PHPUnit\Framework\Constraint\Constraint:private] =>
)
)
[parametersRule:PHPUnit\Framework\MockObject\Matcher:private] =>
[stub:PHPUnit\Framework\MockObject\Matcher:private] => PHPUnit\Framework\MockObject\Stub\ReturnStub Object
(
[value:PHPUnit\Framework\MockObject\Stub\ReturnStub:private] => Array
(
)
)
)
)
[matcherMap:PHPUnit\Framework\MockObject\InvocationHandler:private] => Array
(
)
[configurableMethods:PHPUnit\Framework\MockObject\InvocationHandler:private] => Array
(
[0] => PHPUnit\Framework\MockObject\ConfigurableMethod Object
(
[name:PHPUnit\Framework\MockObject\ConfigurableMethod:private] => findAllModuleRoutes
[returnType:PHPUnit\Framework\MockObject\ConfigurableMethod:private] => SebastianBergmann\Type\SimpleType Object
(
[name:SebastianBergmann\Type\SimpleType:private] => array
[allowsNull:SebastianBergmann\Type\SimpleType:private] =>
[value:SebastianBergmann\Type\SimpleType:private] =>
)
)
[1] => PHPUnit\Framework\MockObject\ConfigurableMethod Object
(
[name:PHPUnit\Framework\MockObject\ConfigurableMethod:private] => findAllQueryBuilderWithSearch
[returnType:PHPUnit\Framework\MockObject\ConfigurableMethod:private] => SebastianBergmann\Type\ObjectType Object
(
[className:SebastianBergmann\Type\ObjectType:private] => SebastianBergmann\Type\TypeName Object
(
[namespaceName:SebastianBergmann\Type\TypeName:private] => Doctrine\ORM
[simpleName:SebastianBergmann\Type\TypeName:private] => QueryBuilder
)
[allowsNull:SebastianBergmann\Type\ObjectType:private] =>
)
)
[2] => PHPUnit\Framework\MockObject\ConfigurableMethod Object
(
[name:PHPUnit\Framework\MockObject\ConfigurableMethod:private] => findListResults
[returnType:PHPUnit\Framework\MockObject\ConfigurableMethod:private] => SebastianBergmann\Type\SimpleType Object
(
[name:SebastianBergmann\Type\SimpleType:private] => array
[allowsNull:SebastianBergmann\Type\SimpleType:private] =>
[value:SebastianBergmann\Type\SimpleType:private] =>
)
)
[3] => PHPUnit\Framework\MockObject\ConfigurableMethod Object
(
[name:PHPUnit\Framework\MockObject\ConfigurableMethod:private] => createQueryBuilder
[returnType:PHPUnit\Framework\MockObject\ConfigurableMethod:private] => SebastianBergmann\Type\UnknownType Object
(
)
)
[4] => PHPUnit\Framework\MockObject\ConfigurableMethod Object
(
[name:PHPUnit\Framework\MockObject\ConfigurableMethod:private] => createResultSetMappingBuilder
[returnType:PHPUnit\Framework\MockObject\ConfigurableMethod:private] => SebastianBergmann\Type\UnknownType Object
(
)
)
[5] => PHPUnit\Framework\MockObject\ConfigurableMethod Object
(
[name:PHPUnit\Framework\MockObject\ConfigurableMethod:private] => createNamedQuery
[returnType:PHPUnit\Framework\MockObject\ConfigurableMethod:private] => SebastianBergmann\Type\UnknownType Object
(
)
)
[6] => PHPUnit\Framework\MockObject\ConfigurableMethod Object
(
[name:PHPUnit\Framework\MockObject\ConfigurableMethod:private] => createNativeNamedQuery
[returnType:PHPUnit\Framework\MockObject\ConfigurableMethod:private] => SebastianBergmann\Type\UnknownType Object
(
)
)
[7] => PHPUnit\Framework\MockObject\ConfigurableMethod Object
(
[name:PHPUnit\Framework\MockObject\ConfigurableMethod:private] => clear
[returnType:PHPUnit\Framework\MockObject\ConfigurableMethod:private] => SebastianBergmann\Type\UnknownType Object
(
)
)
[8] => PHPUnit\Framework\MockObject\ConfigurableMethod Object
(
[name:PHPUnit\Framework\MockObject\ConfigurableMethod:private] => find
[returnType:PHPUnit\Framework\MockObject\ConfigurableMethod:private] => SebastianBergmann\Type\UnknownType Object
(
)
)
[9] => PHPUnit\Framework\MockObject\ConfigurableMethod Object
(
[name:PHPUnit\Framework\MockObject\ConfigurableMethod:private] => findAll
[returnType:PHPUnit\Framework\MockObject\ConfigurableMethod:private] => SebastianBergmann\Type\UnknownType Object
(
)
)
[10] => PHPUnit\Framework\MockObject\ConfigurableMethod Object
(
[name:PHPUnit\Framework\MockObject\ConfigurableMethod:private] => findBy
[returnType:PHPUnit\Framework\MockObject\ConfigurableMethod:private] => SebastianBergmann\Type\UnknownType Object
(
)
)
[11] => PHPUnit\Framework\MockObject\ConfigurableMethod Object
(
[name:PHPUnit\Framework\MockObject\ConfigurableMethod:private] => findOneBy
[returnType:PHPUnit\Framework\MockObject\ConfigurableMethod:private] => SebastianBergmann\Type\UnknownType Object
(
)
)
[12] => PHPUnit\Framework\MockObject\ConfigurableMethod Object
(
[name:PHPUnit\Framework\MockObject\ConfigurableMethod:private] => count
[returnType:PHPUnit\Framework\MockObject\ConfigurableMethod:private] => SebastianBergmann\Type\UnknownType Object
(
)
)
[13] => PHPUnit\Framework\MockObject\ConfigurableMethod Object
(
[name:PHPUnit\Framework\MockObject\ConfigurableMethod:private] => __call
[returnType:PHPUnit\Framework\MockObject\ConfigurableMethod:private] => SebastianBergmann\Type\UnknownType Object
(
)
)
[14] => PHPUnit\Framework\MockObject\ConfigurableMethod Object
(
[name:PHPUnit\Framework\MockObject\ConfigurableMethod:private] => getClassName
[returnType:PHPUnit\Framework\MockObject\ConfigurableMethod:private] => SebastianBergmann\Type\UnknownType Object
(
)
)
[15] => PHPUnit\Framework\MockObject\ConfigurableMethod Object
(
[name:PHPUnit\Framework\MockObject\ConfigurableMethod:private] => matching
[returnType:PHPUnit\Framework\MockObject\ConfigurableMethod:private] => SebastianBergmann\Type\UnknownType Object
(
)
)
)
[returnValueGeneration:PHPUnit\Framework\MockObject\InvocationHandler:private] => 1
[deferredError:PHPUnit\Framework\MockObject\InvocationHandler:private] =>
)
)
我这样试过,方法确实被调用了,但是 repo 没有可供它查找的数据。
$moduleRepository->expects($this->any())
->method('findAll')
->willReturn([]);
$myDebugVar = $moduleRepository->findAll();
fwrite(STDERR, print_r($myDebugVar, TRUE));
输出:
Array()
您的 moduleRepository
将始终 return 空数组,因为您说过要这样做。
这里你说 return 一个空数组 []
:
->willReturn([]);
来自方法 findAll
:
->method('findAll')
有一些方法可以处理它,但现在,我建议您创建一个仅用于测试目的的新数据库,然后创建一个新的 .env.test
文件来扩展原始 .env
文件并使用确切的存储库而不是模拟。
# .env.test.local
DATABASE_URL="mysql://USERNAME:PASSWORD@127.0.0.1:3306/DB_NAME?serverVersion=5.7"
namespace App\Tests\Repository;
use Doctrine\ORM\EntityManager;
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
final class SomeTest extends KernelTestCase
{
private ?EntityManager $entityManager;
protected function setUp(): void
{
$kernel = self::bootKernel();
$this->entityManager = $kernel->getContainer()
->get('doctrine')
->getManager();
}
public function testSomething()
{
//given
$moduleRepository = $this->entityManager->getRepository(ModuleRepository::class);
//when
$result = $moduleRepository->findAll(...);
//then
$this->assertEquals(...);
}
protected function tearDown(): void
{
parent::tearDown();
// doing this is recommended to avoid memory leaks
$this->entityManager->close();
$this->entityManager = null;
}
}
确保您将用数据填充新数据库。最好创建固定装置以自动执行此操作并使用 tearDown
方法清理数据库。