通过数据库访问在Symfony 4中测试服务的正确方法

时间:2018-06-26 11:41:07

标签: unit-testing symfony symfony4

在同时访问数据库的Symfony 4中测试服务的正确方法是什么?

我是Symfony4的新手(在为Symfony2开发之前),我想为Service编写第一个测试。

此服务通过数据库中的实体/原则/ ORM和我的每个方法编写,我想测试是否触发了数据库保存。

在Symfony 2中,当我使用KernelTestCase而不是PHPUnit_Framework_TestCase时,就是这种情况,因为嘲笑EntityManager麻烦很多,而且我通常也想在测试数据库中检查结果。

Symfony 4的所有示例仅提及用于测试命令的KernelTestCase。

我的课:

class UserPropertyService implements UserPropertyServiceInterface
{


    public function __construct(EntityManager $em, LoggerInterface $logger)
    {
    ....
    }

....
}

我尝试测试:

class UserPropertyServiceTest extends KernelTestCase
{
    /** @var UserPropertyService */
    private $userPropertyService;

    public function setUp()
    {
        self::bootKernel();
        $client = static::createClient();
        $container = $client->getContainer();

        $this->userPropertyService = self::$container->get('app.user_management.user_property_service');
}

导致:

Cannot autowire service "App\Service\UserManagement\UserPropertyService": argument 
"$em" of method "__construct()" references class "Doctrine\ORM\EntityManager" 
but no such service exists. 
Try changing the  type-hint to one of its parents: interface "Doctrine\ORM\EntityManagerInterface", 
or interface "Doctrine\Common\Persistence\ObjectManager".

这里合适的方法是什么?我应该使用哪个测试班?

1 个答案:

答案 0 :(得分:1)

这就是服务测试的样子(不要让您的容器通过客户端,因为这些容器是不同的)

顺便说一句,如果您从NULL扩展过来,就不能使用where v.code is null (对控制器测试和static::createClient();类有误解吗?)

KernelTestCase