Хорошо, я смог сделать это двумя разными способами.
Первым решением было загрузить валидатор в методе getExtensions.Фабрика в TypeTestCase не несет с собой валидатор.Таким образом, вы должны не только загрузить валидатор, но и явно указать валидации.Вы можете указать валидацию, используя методы, предоставляемые Symfony, или вы можете напрямую указать валидатор на файл YAML или xml, если вы его используете.
public function getExtensions()
{
$validator = (new ValidatorBuilder())
->addYamlMapping("path_to_validations.yaml")
->setConstraintValidatorFactory(new ConstraintValidatorFactory())
->getValidator();
$extensions[] = new CoreExtension();
$extensions[] = new ValidatorExtension($validator);
return $extensions;
}
Однако я не использовал вышеуказанный подход.Я пошел с еще лучшим решением.Из-за высокой сложности моего тестового примера (так как для этого требовалось несколько сервисов), я использовал специальный контейнер, предоставляемый Symfony KernelTestCase.Он предоставляет частные сервисы в тестах, и фабрика, которую он предоставляет, поставляется с валидатором и валидациями, как вы кодируете в контроллере.Вам не нужно явно загружать валидатор.Ниже приведен мой последний тест, расширяющий KernelTestCase.
namespace App\Tests\Unit\Serializer;
use App\Entity\User;
use App\Form\UserType;
use App\Serializer\FormErrorSerializer;
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
use Symfony\Component\Form\FormFactoryInterface;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Translation\TranslatorInterface;
class FormErrorSerializerTest extends KernelTestCase
{
/**
* {@inheritDoc}
*/
protected function setUp()
{
$kernel = self::bootKernel();
}
public function testConvertFormToArray_invalidData(){
$form_data = [
'email' => 'test',
'plainPassword' => [
'pass' => '1111',
'pass2' => ''
]
];
$user = new User();
$user->setEmail($form_data['email']);
$user->setPlainPassword($form_data['plainPassword']['pass']);
$factory = self::$container->get(FormFactoryInterface::class);
/**
* @var FormInterface $form
*/
$form = $factory->create(UserType::class, $user);
$form->submit($form_data);
$this->assertTrue($form->isSubmitted());
$this->assertFalse($form->isValid());
$translator = self::$container->get(TranslatorInterface::class);
$formErrorSerializer = new FormErrorSerializer($translator);
$errors = $formErrorSerializer->convertFormToArray($form);
$this->assertArrayHasKey('errors', $errors['children']['email']);
$this->assertArrayHasKey('errors', $errors['children']['plainPassword']['children']['pass']);
}
public function testConvertFormToArray_validData(){
$form_data = [
'email' => 'test@example.com',
'plainPassword' => [
'pass' => 'somepassword@slkd12',
'pass2' => 'somepassword@slkd12'
]
];
$user = new User();
$user->setEmail($form_data['email']);
$user->setPlainPassword($form_data['plainPassword']['pass']);
$factory = self::$container->get(FormFactoryInterface::class);
/**
* @var FormInterface $form
*/
$form = $factory->create(UserType::class, $user);
$form->submit($form_data);
$this->assertTrue($form->isSubmitted());
$this->assertTrue($form->isValid());
$translator = self::$container->get(TranslatorInterface::class);
$formErrorSerializer = new FormErrorSerializer($translator);
$errors = $formErrorSerializer->convertFormToArray($form);
$this->assertArrayNotHasKey('errors', $errors['children']['email']);
$this->assertArrayNotHasKey('errors', $errors['children']['plainPassword']['children']['pass']);
}
}
Обратите внимание, что в Symfony 4.1 имеется специальный контейнер, позволяющий получать частные сервисы.
self::$kernel->getContainer();
не является специальным контейнером.Он не будет получать частные сервисы.
Однако self::$container;
- это специальный контейнер, который предоставляет частные сервисы при тестировании.
Подробнее об этом здесь .