Witam,
mam problem z testowaniem błędów w formularzu, mam taki formularz:
<?php
declare(strict_types=1);
namespace App\Form;
use App\Entity\User;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
class UserType extends AbstractType
{
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('username', TextType::class)
->add('plainPassword', PasswordType::class)
->add('email', EmailType::class)
;
}
/**
* @param OptionsResolver $resolver
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => User::class,
]);
}
}
a tak wygląda mój validation.yaml
App\Entity\User:
constraints:
- Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity: username
- Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity: email
properties:
username:
- NotBlank: ~
- Length:
min: 3
max: 80
password:
- Length:
min: 8
plainPassword:
- NotBlank: ~
- Length:
min: 8
email:
- Email:
message: The email "{{ value }}" is not a valid email.
checkMX: true
- NotBlank: ~
createdAt:
- DateTime: ~
chciałem przetestować formularz z danymi które nie mogą przejść walidacji ale wyrzuca mi błąd: Failed asserting that true is false, próbowałem robić tak jak jest napisane w dokumentacji symfony oraz ze stackoverflow ale nic nie działa :/
<?php
namespace App\Tests\Form;
use App\Entity\User;
use App\Form\UserType;
use Symfony\Component\Form\Extension\Core\CoreExtension;
use Symfony\Component\Form\Extension\Validator\ValidatorExtension;
use Symfony\Component\Form\Form;
use Symfony\Component\Form\Test\TypeTestCase;
use Symfony\Component\Translation\IdentityTranslator;
use Symfony\Component\Validator\ConstraintValidatorFactory;
use Symfony\Component\Validator\Context\ExecutionContextFactory;
use Symfony\Component\Validator\Mapping\ClassMetadata;
use Symfony\Component\Validator\Tests\Fixtures\FakeMetadataFactory;
use Symfony\Component\Validator\Validator\RecursiveValidator;
class UserTypeTest extends TypeTestCase
{
protected function getExtensions()
{
$extensions = parent::getExtensions();
$metadataFactory = new FakeMetadataFactory();
$metadataFactory->addMetadata(new ClassMetadata( Form::class));
$validator = $this->createValidator($metadataFactory);
$extensions[] = new CoreExtension();
$extensions[] = new ValidatorExtension($validator);
return $extensions;
}
protected function createValidator(\Symfony\Component\Validator\Mapping\Factory\MetadataFactoryInterface $metadataFactory, array $objectInitializers = array())
{
$translator = new IdentityTranslator();
$translator->setLocale('en');
$contextFactory = new ExecutionContextFactory($translator);
$validatorFactory = new ConstraintValidatorFactory();
return new RecursiveValidator($contextFactory, $metadataFactory, $validatorFactory, $objectInitializers);
}
/**
* @dataProvider formDataIsValidProvider
*/
public function testFormIfDataIsValid($formData, $user, $expected)
{
$form = $this->factory->create(UserType::class, $user);
$form->submit($formData);
$this->assertTrue($form->isSynchronized());
$this->assertTrue($form->isValid());
$this->assertEquals($expected, $user);
}
/**
* @dataProvider formDataIsNotValidProvider
*/
public function testFormIfDataIsNotValid($user, $formData)
{
$form = $this->factory->create(UserType::class, $user);
$form->submit($formData);
$this->assertFalse($form->isValid());
}
public function formDataIsValidProvider()
{
$formData = [
'username' => 'Example',
'plainPassword' => 'Example',
'email' => 'Example',
];
$user = new User();
$expected = new User();
$expected->setUsername('Example');
$expected->setPlainPassword('Example');
$expected->setEmail('Example');
return [
[ $formData, $user, $expected ]
];
}
public function formDataIsNotValidProvider()
{
$user = new User();
$formDataIsBlank = [
'username' => '',
'plainPassword' => '',
'email' => ''
];
$formDataIsNotHaveLength = [
'username' => '12',
'plainPassword' => '1234567',
'email' => 'e@gmail.com'
];
$formDataBadEmail = [
'username' => 'ExampleUsername',
'plainPassword' => 'ExamplePassword',
'email' => 'ExampleEmail'
];
return [
[ $user, $formDataIsBlank ],
[ $user, $formDataIsNotHaveLength ],
[ $user, $formDataBadEmail ]
];
}
}