правильный способ протестировать сервис в Symfony 4 с доступом к базе данных - PullRequest
0 голосов
/ 26 июня 2018

Как правильно проверить службу в Symfony 4, которая также обращается к базе данных?

Я новичок в Symfony4 (до того, как я разработал для Symfony2), и я хочу написать свой первый тест для службы.

Эта служба записывает данные через базу данных Entities / Doctrine / 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 голосов
/ 26 июня 2018

Вот так выглядит сервисный тест (не передавайте свой контейнер через клиента, эти контейнеры разные)

Кстати, вы не можете использовать static::createClient();, если вы расширяете от KernelTestCase (недоразумение с тестом контроллера и классом WebTestCase?)

<?php

namespace App\Tests\Service;

use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;

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

    public function setUp() {
        self::bootKernel();
        $this->myService = self::$kernel->getContainer()->get('app.user_management.user_property_service');
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...