Bonjour,
je veux pouvoir créer un formulaire avec le type ChoiceType, j'ai défini les choix et les contraintes sur l'entité.
Maintenant, je veux tester l'affichage d'une erreur sur le formulaire lorsqu'un choix invalide est envoyé, mais Symfony me lance une erreur InvalidArgumentException
.
Voici le code du formulaire :
class AccountFormType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder
->add('type', ChoiceType::class, [
'choices' => [
'Professionnel' => 'PERSONNAL',
'Personnel' => 'PROFESSIONAL',
]
]);
}
// reste du code...
}
Et voici mon code de test phpunit:
class AccountTest extends WebTestCase {
public function testShopShowErrorsOnInvalidInput() {
$client = self::createClient();
$crawler = $client->request('GET/', '/profile/create');
$form = $crawler->selectButton('Créer votre compte')->form([
'type' => 'custom',
]);
$crawler = $client->submit($form);
// la classe css '.invalid-feedback' indique qu'une erreur s'est bien affichée sur mon
// formulaire
$this->assertSame(1, $crawler->filter('.invalid-feedback')->count());
}
}
Je veux que l'erreur s'affiche sur le formulaire, c'est-à-dire que mon test passe.
Symfony m'affiche une erreur :
InvalidArgumentException : Input "type" cannot take "custom" as a value (possible values: "PERSONAL", "PROFESSIONAL").
Finalement jai pu régler mon problème, au fait le problème était dans phpunit, l'objet $crawler
effectue une validation en amont sur les champs de type ChoiceType
. Donc pour régler le problème j'ai eu à désactiver la validation du $crawler
et c'est réglé :
Le code :
class AccountTest extends WebTestCase {
public function testShopShowErrorsOnInvalidInput() {
$client = self::createClient();
$crawler = $client->request('GET/', '/profile/create');
$form = $crawler->selectButton('Créer votre compte')->form();
// on désactive la validation
$form->disableValidation();
// et on affecte la valeur à tester dans le champ
$form->get('type')->setValue('custom');
$crawler = $client->submit($form);
// la classe css '.invalid-feedback' indique qu'une erreur s'est bien affichée sur mon
// formulaire
$this->assertSame(1, $crawler->filter('.invalid-feedback')->count());
}
}
Merci de ton aide !
Salut,
En faite, pour un choiceType sur une entité préçise, tu ne devras pas utiliser le type "ChoiceType" mais "EntityType" vu que tu te base sur ton entité.
Exemple :
Imaginons que j'ai une entité qui se nomme "Metier"
Il possède un (id, name).
->add('type', EntityType::class, [
'label' => 'Mon métier', // label du formulaire
'class' => Metier::class, // référence à mon entité
'choice_label' => 'name', // affiche tous mes métier référence de ma table name
'placeholder' => '--- Choisissez un métier', // le placeholder
])
Le fait est que le champ type
n'est pas une entité, c'est une chaîne de caractères et je veux limiter la valeur de cette chaîne à 2 valeurs possibles seulement comme un Enum en MySQL.