【问题标题】:Dependency Injection with Fixtures使用 Fixtures 进行依赖注入
【发布时间】:2018-07-06 23:40:48
【问题描述】:

我正在使用 Symfony 4 构建一个 Web 应用程序。我正在尝试从我的功能测试中加载固定装置。我创建了一个夹具类:

<?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 TestFixtures extends Fixture
{
private $encoder;

public function __construct(UserPasswordEncoderInterface $encoder)
{
    $this->encoder = $encoder;
}

public function load(ObjectManager $em)
{
    $user = new User();
    $user->setUsername('user@gamil.com');
    $user->setIsActive(true);
    $user->setEmail('user@gmail.com');
    $user->setFirstName('John');
    $user->setLastName('Doe');
    $user->setSchool($school);
    $user->setRoles(['ROLE_USER']);
    $password = $this->encoder->encodePassword($user, 'pass1234');
    $user->setPassword($password);

    $em->persist($user);
    $em->flush();

    return $user;
}

}

我已配置 services_test.yaml 以将服务传递给夹具:

services:
_defaults:
    public: true

App\DataFixtures\TestFixtures:
    arguments: ['@security.password_encoder']

但是,当我尝试运行测试时,出现以下错误:

ArgumentCountError:函数 App\DataFixtures\TestFixtures::__construct() 的参数太少,在第 38 行的 /Development/app/src/Test/ApiTestCase.php 中传递了 0,而预期正好是 1

这是我的测试用例中的函数:

protected function setUp()
{
    $this->client = self::$staticClient;
    $this->purgeDatabase();

    $em = $this->getEntityManager();
    $fixture = new TestFixtures();
    $fixture->load($em);
}

提前感谢您对此提供的任何建议...

【问题讨论】:

  • 设置 TestFixture 服务参数并不重要,因为在您的测试中您正在执行新的 TestFixtures,注册的服务和测试中的实例是两个不同的东西。尝试从容器中检索服务,而不是 symfony.com/blog/new-in-symfony-4-1-simpler-service-testing stackoverflow.com/a/17798257/5988258 。如果你无法做到,也许可以告诉 symfony 的确切版本
  • 感谢您的帮助,我目前正在使用 Symfony 4.0,但 4.1 版本看起来在这种情况下非常有用,所以我会考虑升级。

标签: symfony


【解决方案1】:

您正在实例化一个类: $fixture = new TestFixtures(); 而您需要它作为服务。 您需要这样做$fixture = new TestFixtures(encoder); 其中encoder 是实例化类或编码器类的模拟,或者从客户端容器中检索TestFixtures 类。我不完全确定,但试试 $fixture = $this-&gt;client-&gt;getContainer()-&gt;get('App\DataFixtures\TestFixtures');

【讨论】:

  • $fixture = $this->client->getContainer()->get('App\DataFixtures\TestFixtures');完美运行,感谢您的有用建议:)
  • @Domagoj 你的回答对我也有帮助。感谢那。相反,我在其他地方也有同样的错误。在少数夹具中,我确保之前加载了需要加载当前的夹具:public function getDependencies() { return [ UserFixtures::class, AnotherFixtures::class, ]; } UserFixtures 使用依赖注入来加载所需的服务,而那个地方会导致问题。如果我评论 UserFixtures::class 所有灯具都正确加载,如果我关心他们排队。你知道如何让它发挥作用吗?
猜你喜欢
  • 2015-09-26
  • 2014-01-19
  • 2014-03-25
  • 2019-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多