Внедрить сервис в Doctrine Fixtures в контексте PhpUnit - PullRequest
0 голосов
/ 04 июня 2018

Я использую Symfony 4 и PhpUnit и пытаюсь внедрить службу в Doctrine Fixtures и контексте PhpUnit

Это класс моего прибора, как вы можете видеть, я ввожу UserPasswordEncoderInterface в конструктор

<?php

namespace App\DataFixtures;

use App\Entity\User;
use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Common\Persistence\ObjectManager;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;

/**
 * Class UserFixtures
 * @package App\DataFixtures
 */
class UserFixtures extends Fixture
{
    /**
     * @var UserPasswordEncoderInterface
     */
    private $encoder;

    /**
     * UserFixtures constructor.
     * @param UserPasswordEncoderInterface $encoder
     */
    public function __construct(UserPasswordEncoderInterface $encoder)
    {
        $this->encoder = $encoder;
    }

    /**
     * @param ObjectManager $manager
     * @throws \Exception
     */
    public function load(ObjectManager $manager)
    {
        $user = new User();
        $user->setFirstname('firstname1');
        $user->setLastname('lastname1');
        $user->setBalance(100);
        $user->setLastUpdateAt(new \DateTime());
        $user->setPlainPassword('test');
        $user->setOptin(true);
        $user->setEnabled(true);
        $user->setEmail('user1@test.fr');
        $user->setPseudo('test');
        $user->setGender(User::GENDER_MALE);
        $user->setBirthdate((new \DateTime())->modify('-20 year'));

        $password = $this->encoder->encodePassword($user, 'test');
        $user->setPassword($password);

        $manager->persist($user);
        $manager->flush();
    }
}

Когда я делаю:

bin/console doctrine:fixtures:load 

Это отлично работает и данные корректно загружаются в базу данных.Я также использую эти приборы для своих функциональных тестов PhpUnit. Поэтому я загружаю свои приборы в свои тесты следующим образом:

$client = static::createClient();
$client->getContainer()->get('doctrine.orm.entity_manager');
$loader = new Loader();
$loader->loadFromDirectory('src/DataFixtures');
$purger = new ORMPurger();
$executor = new ORMExecutor($em, $purger);
$executor->execute($loader->getFixtures(), true);

Но PhUnit не понимает внедрение в этом контексте, и у меня есть эта ошибка:

Too few arguments to function App\DataFixtures\UserFixtures::__construct(), 0 passed in /home/psylo/Projects/api-pmu/vendor/doctrine/data-fixtures/lib/Doctrine/Common/DataFixtures/Loader.php on line 193 and exactly 1 expected in /home/psylo/Projects/api-pmu/src/DataFixtures/UserFixtures.php:25

Так как я могу указать инъекцию в тестах phpunit Doctrine load fixtures?Есть другое решение для этого?

Заранее спасибо за помощь.

1 Ответ

0 голосов
/ 04 июня 2018

Вы можете создать файл bash следующим образом (я обычно называю это runtests.sh):

#!/bin/bash

bin/console doctrine:fixtures:load 
./vendor/bin/phpunit 

После того, как вы сможете запустить CLI:

./runtests.sh

PS Я надеваюЯ не знаю точно, как вы запускаете тестирование в вашем приложении, я полагаю, таким образом: ./vendor/bin/phpunit

...