模拟存储库请求

问题描述 投票:0回答:1

我尝试按照这 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。

symfony testing mocking symfony6
1个回答
0
投票

在容器中设置存储库后,我通过再次获取服务找到了解决方案。我的服务是在 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);

然后我的请求用我的模拟结果而不是数据库结果进行响应。

© www.soinside.com 2019 - 2024. All rights reserved.