【发布时间】: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