Тест Symfony не может получить доступ к хранилищу - PullRequest
0 голосов
/ 03 мая 2018

Я использую Symfony 4 и у меня есть функциональный тест, где мне нужен доступ к моей базе данных. Но когда это выполнено:

$repository = $this->getDoctrine()->getRepository(User::class);

У меня есть такой вывод:

App \ Тесты \ Controller \ AppControllerTest :: testPostSubmit Ошибка: вызов неопределенного метода App \ Tests \ Controller \ AppControllerTest :: getDoctrine ()

Это мой phpunit.xml.dist:

<?xml version="1.0" encoding="UTF-8"?>

<!-- https://phpunit.de/manual/current/en/appendixes.configuration.html -->
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="http://schema.phpunit.de/6.1/phpunit.xsd"
         backupGlobals="false"
         colors="true"
         bootstrap="vendor/autoload.php"
>
    <php>
        <ini name="error_reporting" value="-1" />
        <env name="KERNEL_CLASS" value="App\Kernel" />
        <env name="APP_ENV" value="test" />
        <env name="APP_DEBUG" value="1" />
        <env name="APP_SECRET" value="s$cretf0rt3st" />
        <env name="SHELL_VERBOSITY" value="-1" />
        <env name="DATABASE_URL" value="mysql://root:root@127.0.0.1:3306/haytest" />
        <!-- define your env variables for the test env here -->
    </php>

    <testsuites>
        <testsuite name="Project Test Suite">
            <directory>tests/</directory>
        </testsuite>
    </testsuites>

    <filter>
        <whitelist>
            <directory>./src/</directory>
        </whitelist>
    </filter>

    <listeners>
        <listener class="Symfony\Bridge\PhpUnit\SymfonyTestsListener" />
    </listeners>
</phpunit>

А это мой тест (он еще не закончен):

/**
 * Test the submitting of posts
 */
public function testPostSubmit()
{
    $client = static::createClient();

    $repository = $this->getDoctrine()->getRepository(User::class);

    if (!$this->getUser()) {
        if (!$repository->find(1)) {
            $user = new User;

            $user->setFirstName('root');
            $user->setLastName('root');
            $user->setUsername('root');
            $user->setEmail('root@root.root');
            $user->setPassword(password_hash('root', PASSWORD_ARGON2I));

            $em = $this->getDoctrine()->getManager();
            $em->persist($user);
            $em->flush();
        }

        $loginpage = $client->request('GET', '/en/login');
        $form = $loginpage->selectButton('submit')->form();
        $form['username'] = 'root';
        $form['password'] = 'root';
        $client->submit($form);
    }

    // We request the app_index controller.
    $crawler = $client->request('GET', '/en/');

    // We verify that we have a 200 status code.
    $this->assertEquals(200, $client->getResponse()->getStatusCode());
}

Я действительно не понимаю, почему это не работает ...

1 Ответ

0 голосов
/ 04 мая 2018

Если ваш тестовый класс наследует от KernelTestCase, вы можете получить объект EntityManager через класс Kernel в функции настройки:

/** @var \Doctrine\ORM\EntityManager */
private $entityManager;

public function setUp()
{
    $kernel = self::bootKernel();
    $this->entityManager = $kernel
        ->getContainer()
        ->get('doctrine')
        ->getManager();
}

Если ваш класс наследует от WebTestCase, вы также можете получить объект EntityManager через экземпляр Client в функции настройки:

/** @var \Doctrine\ORM\EntityManager */
private $entityManager;

public function setUp()
{
    $client = static::createClient();
    $this->entityManager = $client
        ->getContainer()
        ->get('doctrine')
        ->getManager();
}

Ознакомьтесь с этой частью документации Symfony для получения дополнительной информации о тестировании репозиториев Doctrine.

...