首页 > 解决方案 > 用于测试的 Symfony 模拟存储库

问题描述

我正在尝试模拟一个包含所有模块的存储库,它有一个名为 findAll() 的方法,该方法返回该存储库中的所有元素。我似乎无法从模拟存储库中提取任何数据。有什么想法可以解决吗?

模拟存储库:

$moduleRepository = $this->createMock(ModuleRepository::class);

尝试使用 ModuleRepository 类中名为 findAll() 的方法,该方法返回数组中存储库中的所有元素。

$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()

标签: phpsymfonyphpunit

解决方案


moduleRepository将始终返回空数组,因为您说过要这样做。

在这里你说要返回一个空数组[]

->willReturn([]);

从方法findAll

->method('findAll')

有一些方法可以处理它,但是现在,我建议您仅出于测试目的创建一个新数据库,然后创建一个新.env.test文件,该文件将扩展原始.env文件并使用确切的存储库而不是 mock。

# .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方法上的数据库是一个好主意。


推荐阅读