PHPUnit 测试中存储库的 Symfony 依赖注入或服务位置
Symfony dependency injection or service location for Repositories in PHPUnit tests
我正在 API Platform(基于 Symfony 5)和 PHPUnit 中为我的代码编写测试。
我创建了一个名为 TestContext
的基础测试用例,它扩展了 ApiTestCase
。我的所有测试 classes 将扩展 TestContext
以重用共享测试样板代码。
我也在尝试使用依赖注入(或服务位置)来解析存储库 class,这样我就可以在所有子 classes 中访问它们。
在我的测试中访问我的存储库的最干净、最简单和最佳实践的方法是什么 classes?
为了为 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());
...
}
}
这适用于我的大多数情况。我希望它对你有用 ;)
我正在 API Platform(基于 Symfony 5)和 PHPUnit 中为我的代码编写测试。
我创建了一个名为 TestContext
的基础测试用例,它扩展了 ApiTestCase
。我的所有测试 classes 将扩展 TestContext
以重用共享测试样板代码。
我也在尝试使用依赖注入(或服务位置)来解析存储库 class,这样我就可以在所有子 classes 中访问它们。
在我的测试中访问我的存储库的最干净、最简单和最佳实践的方法是什么 classes?
为了为 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());
...
}
}
这适用于我的大多数情况。我希望它对你有用 ;)