【问题标题】:Inject service in Doctrine Fixtures on PhpUnit context在 PhpUnit 上下文的 Doctrine Fixtures 中注入服务
【发布时间】:2018-06-04 09:30:31
【问题描述】:

我正在使用 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 固定装置加载中指定注入? 还有其他解决方案吗?

提前感谢您的帮助。

【问题讨论】:

    标签: symfony dependency-injection doctrine phpunit fixtures


    【解决方案1】:

    你可以像这样创建一个 bash 文件(我通常称之为runtests.sh):

    #!/bin/bash
    
    bin/console doctrine:fixtures:load 
    ./vendor/bin/phpunit 
    

    在您可以从 CLI 启动之后:

    ./runtests.sh
    

    附:我不知道你是如何在我的应用程序中启动测试的:./vendor/bin/phpunit

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-15
      • 2014-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-30
      • 1970-01-01
      相关资源
      最近更新 更多