我尝试按照这 2 个指南和一个 SO 问题模拟对我的数据库的请求:
所以我有这个代码:
public static function kernelAndService(): array
{
$kernel = self::bootKernel(['environment' => 'test']);
$mangaService = static::getContainer()->get(MangaService::class);
$categoryRepository = static::getContainer()->get(CategoryRepository::class);
return [
[$kernel, $mangaService, $categoryRepository]
];
}
/**
* Test utilisant un mockage de données
* @dataProvider kernelAndService
*/
public function testGetBestOfTwoMangasByCategoryMock(
KernelInterface $kernel,
MangaService $mangaService,
CategoryRepository $categoryRepository
): void
{
// Boot du kernel pour accéder au container et déinir nos classes mockées
$kernel->boot();
$container = $kernel->getContainer();
// Mockage de notre classe MangaRepository
$mangaRepository = $this->createMock(MangaRepository::class);
$mangaRepository->expects(self::any())->method('getBestOfThreeMangasByCategory')
->withAnyParameters()
->willReturn([
new Manga(),
new Manga(),
])
;
// Mockage de l'entity manager pour lui passer notre repository
$entityManager = $this->createMock(ManagerRegistry::class);
$entityManager->expects(self::any())->method('getManager')->willReturn($entityManager);
$entityManager->expects(self::any())->method('getRepository')
->withAnyParameters()
->willReturn($mangaRepository);
$container->set(EntityRepository::class, $entityManager);
$container->set(MangaRepository::class, $mangaRepository);
$category = $categoryRepository->findOneBy(['name' => 'Ninja']);
$mangas = $mangaService->getBestOfThreeMangasByCategory($category);
assertCount(2, $mangas);
}
断言后,我收到以下错误消息:
Failed asserting that actual size 1 matches expected size 2.
在我的模拟中,我创建了 2 个漫画实体,而数据库中有一个漫画实体,在转储
$mangas
变量后,我检查它是否包含数据库结果而不是模拟预期结果。
如何正确模拟我的存储库?
Symfony 版本,是 6.4。
在容器中设置存储库后,我通过再次获取服务找到了解决方案。我的服务是在 dataProvider 中使用构造函数中的非模拟
MangaRepository
进行初始化的。
// Mocking
$mangaRepository = $this->createMock(MangaRepository::class);
$mangaRepository->expects(self::any())->method('getBestOfThreeMangasByCategory')
->withAnyParameters()
->willReturn([
new Manga(),
new Manga(),
]);
// Add mock repository to container
$container->set(MangaRepository::class, $mangaRepository);
// Get a new service class initialized with mocked repository
$mangaService = $container->get(MangaService::class);
然后我的请求用我的模拟结果而不是数据库结果进行响应。