PHPUnit测试中存储库的Symfony依赖项注入或服务位置

问题描述

我正在API Platform(基于Symfony 5构建)和PHPUnit中为我的代码编写测试。

我创建了一个名为TestContext的基本测试用例,它扩展了ApiTestCase。我所有的测试类都将扩展TestContext以重用共享的测试样板代码

我还尝试使用依赖项注入(或服务位置)来解析Repository类,以便可以在所有子类中访问它们。

在我的测试课程中访问我的存储库的最干净,最简单和最佳实践的方法是什么?

解决方法

为了注入用于API测试的存储库,我有一个src / Test / BaseApiTest.php

namespace App\Test;

use ApiPlatform\Core\Bridge\Symfony\Bundle\Test\ApiTestCase;
use Doctrine\ORM\EntityManagerInterface;
use Hautelook\AliceBundle\PhpUnit\ReloadDatabaseTrait;

class BaseApiTestCase extends ApiTestCase
{
    use ReloadDatabaseTrait;

    protected ?EntityManagerInterface $em;

    protected function setUp(): void
    {
        $kernel = self::bootKernel();

        $this->em = $kernel->getContainer()
            ->get('doctrine')
            ->getManager();
    }
}

然后在我的根tests目录中进行测试,我可以按照他的指示进行访问:

//tests/UserRessourceTest.php
<?php

namespace App\Tests;

use App\Entity\User;
use App\Test\BaseApiTestCase;

class UserResourceTest extends BaseApiTestCase
{
    public function testDeleteAccount(): void
    {
        ...
        /** @var User $deletedUser */
        $deletedUser = $this->em->getRepository(User::class)->findOneById($user->getId());
        ...
    }
}

这对于我的大多数情况都很好。我希望它对您有用;)