IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

PHPUnit - InvalidArgumentException: The current node list is empty.


Sujet :

Symfony PHP

  1. #1
    Membre à l'essai
    Femme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2018
    Messages : 6
    Par défaut PHPUnit - InvalidArgumentException: The current node list is empty.
    Bonjour à tous,

    je rencontre un problème lors d'un test unitaire : je souhaite tester un formulaire mais j'ai l'impression que je n'arrive pas à le remplir correctement car j'ai une InvalidArgumentException: The current node list is empty.

    Pourtant tous mes champs obligatoires sont remplis, mais je me demande si ce ne sont pas mes champs de date qui posent problème...

    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    public function testUserCreate()
    	{
    		$client = static::createClient();
    		$users = $this->loadFixtureFiles(['tests/DataFixtures/UserTestFixtures.yaml']);
    		/** @var User $user */
    		$user = $users['user_admin'];
     
    		$epns = $this->loadFixtureFiles(['tests/DataFixtures/EpnTestFixtures.yaml']);
    		$epn = $epns['epn_cedreBleu'];
     
    		$this->login($client, $user);
     
    		$crawler = $client->request('GET', '/user/create');
     
    		$form = $crawler->selectButton('Ajouter')->form([
    			'user_create[epn]' => $epn,
    			'user_create[email]' => "nomTestUserCreate\@prenomTestUserCreate.fr",
    			'user_create[password][first]' => "unPWD",
    			'user_create[password][second]' => "unPWD",
    			'user_create[expireAt][month]' => 1,
    			'user_create[expireAt][day]' => 1,
    			'user_create[expireAt][year]' => 2016,
    			'user_create[surname]' => "nomTestUserCreate",
    			'user_create[firstname]' => "prenomTestUserCreate",
    			'user_create[birthdate][month]' => 1,
    			'user_create[birthdate][day]' => 1,
    			'user_create[birthdate][year]' => 2016,
    			'user_create[roles]' => "ROLE_USER",
    		]);
     
    		$client->submit($form);
    		$this->assertResponseRedirects('/users');
    		$client->followRedirect();
    		$this->assertSelectorExists('.alert-success');
    	}

  2. #2
    Membre chevronné
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    351
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 351
    Par défaut
    Salut,

    Est-ce que tu arrives à savoir plus précisément quelle partie du code déclenche cette exception ? (ex: si tu sélectionnes juste le formulaire sans remplir de champ, ou en remplissant les champs un par un jusqu'à trouver lequel pose problème)

    Ça pourrait aussi aider de savoir à quoi ressemble le formulaire qui se trouve sur /user/create.

  3. #3
    Membre à l'essai
    Femme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2018
    Messages : 6
    Par défaut
    Merci de ta réponse,

    Justement c'est bien mon problème d'essayer de trouver quelle partie déclenche le bug...

    Si je fais un dump($crawler) j'ai bien le résultat du dump mais si je fais un dump($form) l'erreur est déclenchée.

    Si je ne met rien dans le formulaire cela me sort le message d'erreur InvalidArgumentException: The current node list is empty, étant donné que ce sont des champs obligatoires.

    Normalement dans ce test j'ai bien rempli tous les champs obligatoires (à un moment donné j'ai même rempli l'ensemble des champs au cas où mais j'ai le même message d'erreur).

    Voici le contenu de mon formulaire :

    Code twig : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    {{ form_start(form, {'attr': {'novalidate': 'novalidate'}}) }}
     
    <fieldset>
        <legend>EPN</legend>
        <div class="row">
            <div class="col-6">
                <strong>{{ form_row(form.epn) }}</strong>
            </div>
        </div>
    </fieldset>
     
    <fieldset>
        <legend>Compte</legend>
        <div class="row">
            <div class="col-6">
                <strong>{{ form_row(form.email) }}</strong>
            </div>
            <div class="col-6">
                {{ form_row(form.category) }}
            </div>
        </div>
        <div class="row">
            {% if (controller_name != 'user_userEdit') or (controller_name != 'profileEdit') %}
                <div class="col-6">
                    <strong>{{ form_row(form.password) }}</strong>
                </div>
            {% endif %}
            {% if ((is_granted('IS_ANONYMOUS')) or (is_granted('ROLE_USER'))) %}
                <div class="col-6" style="display: none">
                    {{ form_row(form.expireAt) }}
                </div>
            {% endif %}
        </div>
    </fieldset>
     
    <fieldset>
        <legend>Identité</legend>
        <div class="row">
            <div class="col-6">
                <strong>{{ form_row(form.surname) }}</strong>
            </div>
            <div class="col-6">
                <strong>{{ form_row(form.firstname) }}</strong>
            </div>
        </div>
        <div class="row">
            <div class="col-6">
                {{ form_row(form.birthdate) }}
            </div>
        </div>
    </fieldset>
     
    <fieldset>
        <legend>Coordonnées</legend>
        <div class="row">
            <div class="col-6">
                {{ form_row(form.address) }}
            </div>
            <div class="col-6">
                {{ form_row(form.town) }}
            </div>
        </div>
        <div class="row">
            <div class="col-6">
                {{ form_row(form.mainPhoneNumber) }}
            </div>
            <div class="col-6">
                {{ form_row(form.secondaryPhoneNumber) }}
            </div>
        </div>
    </fieldset>
     
    {% if is_granted("ROLE_ADMIN") %}
        <fieldset>
            <legend>Rôle</legend>
            <div class="col-6">
                {{ form_row(form.roles) }}
            </div>
        </fieldset>
    {% else %}
        <div style="display: none">
            {{ form_row(form.roles) }}
        </div>
    {% endif %}
     
    <div class="form-group float-right">
        <button type="reset" class="btn btn-danger">Annuler</button>
        {% if controller_name == 'user_userCreate' %}
            <button type="submit" class="btn btn-success">Ajouter</button>
        {% elseif controller_name == 'user_userEdit' %}
            <button type="submit" class="btn btn-success">Modifier</button>
        {% else %}
            <button type="submit" class="btn btn-success">Envoyer</button>
        {% endif %}
    </div>
     
    {{ form_end(form) }}

  4. #4
    Membre à l'essai
    Femme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2018
    Messages : 6
    Par défaut
    Alors en fait mon problème ne venait pas du crawler, mais du fait que le chargement mon deuxième fichier de fixtures écrasait le premier !

    Ce qui fait que je n'étais pas connectée en tant qu'admin et donc que j'étais redirigée vers la page de login... Mon crawler ne pouvait pas trouver les nodes de mon formulaire d'enregistrement du coup

    Au final je ne charge plus que mon fichier de fixtures contenant mes users et pour mon premier champ de formulaire je donne un identifiant plutôt qu'un objet, et ça fonctionne.

    Je ne met pas encore le sujet résolu car pour le moment j'ai encore un pb avec ma redirection mais je pense que demain ça devrait être réglé

  5. #5
    Membre à l'essai
    Femme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2018
    Messages : 6
    Par défaut
    Bon... mon test fonctionne si mon assert est un HTTP_OK mais pas si c'est un redirect, alors que je redirect bien sur la bonne route...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $this->assertResponseRedirects('/users/usersList');
    me fait une failure (is redirected and has header "Location" with value "/users/usersList".)

    Quelqu'un aurait une idée pourquoi car là je sèche complètement...

  6. #6
    Membre chevronné
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    351
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 351
    Par défaut
    Sans voir le code du test en question c'est toujours plus incertain, mais est-ce qu'en ajoutant ce genre d'instruction ça fonctionnerait mieux ? https://symfony.com/doc/current/test...ml#redirecting

  7. #7
    Membre à l'essai
    Femme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2018
    Messages : 6
    Par défaut
    Oui pardon, c'est le même code que dans le premier message que j'ai posté et du coup j'avais bien ajouté la méthode followRedirects();

    Je le remet ici quand même :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    public function testUserCreate()
    	{
    		$client = static::createClient();
    		$users = $this->loadFixtureFiles(['tests/DataFixtures/UserTestFixtures.yaml']);
    		$user = $users['user_admin'];
     
    		$this->login($client, $user);
     
    		$crawler = $client->request('GET', '/user/create');
     
    		$form = $crawler->selectButton('Ajouter')->form([
    			'user_create[epn]' => 1,
    			'user_create[email]' => "nomTestUserCreate\@prenomTestUserCreate.fr",
    			'user_create[password][first]' => "unPWD",
    			'user_create[password][second]' => "unPWD",
    			'user_create[expireAt][month]' => 1,
    			'user_create[expireAt][day]' => 1,
    			'user_create[expireAt][year]' => 2016,
    			'user_create[surname]' => "nomTestUserCreate",
    			'user_create[firstname]' => "prenomTestUserCreate",
    			'user_create[birthdate][month]' => 1,
    			'user_create[birthdate][day]' => 1,
    			'user_create[birthdate][year]' => 2016,
    			'user_create[roles]' => "ROLE_USER",
    		]);
     
    		$client->submit($form);
    		$this->assertResponseRedirects('/users/usersList');
    		$client->followRedirects();
    		$this->assertSelectorExists('.alert-success');
    	}
    Et du coup dans la console ça me ressort le code HTML de ma page, suivi de :

    'version' => '1.1'
    'statusCode' => 200
    'statusText' => 'OK'
    'charset' => 'UTF-8'
    ) is redirected and has header "Location" with value "/users/usersList".

    /home/ccoubard/Public/ProjetsTeicee/Applications/ProxyEPN/ProxyEPN_Sf5/ProxyEPN_Sf5/vendor/symfony/framework-bundle/Test/BrowserKitAssertionsTrait.php:132
    /home/ccoubard/Public/ProjetsTeicee/Applications/ProxyEPN/ProxyEPN_Sf5/ProxyEPN_Sf5/vendor/symfony/framework-bundle/Test/BrowserKitAssertionsTrait.php:51
    /home/ccoubard/Public/ProjetsTeicee/Applications/ProxyEPN/ProxyEPN_Sf5/ProxyEPN_Sf5/tests/Controller/UserControllerTest.php:108

    FAILURES!
    Tests: 1, Assertions: 2, Failures: 1.

  8. #8
    Membre à l'essai
    Femme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2018
    Messages : 6
    Par défaut
    Quand je regarde la méthode assertResponseRedirects() en fait je me rend compte que ce n'est pas l'adresse qu'il attend pour la redirection donc le pb vient de ce niveau là.

    Code source de la méthode assertResponseRedirects() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public static function assertResponseRedirects(string $expectedLocation = null, int $expectedCode = null, string $message = ''): void
        {
            $constraint = new ResponseConstraint\ResponseIsRedirected();
            if ($expectedLocation) {
                $constraint = LogicalAnd::fromConstraints($constraint, new ResponseConstraint\ResponseHeaderSame('Location', $expectedLocation));
            }
            if ($expectedCode) {
                $constraint = LogicalAnd::fromConstraints($constraint, new ResponseConstraint\ResponseStatusCodeSame($expectedCode));
            }
     
            self::assertThatForResponse($constraint, $message);
        }
    Mais je ne comprend pas pourquoi car en vrai sur mon appli je suis réellement redirigée sur /users/usersList et dans mon controller c'est bien cette route là qui est définie également...

  9. #9
    Membre chevronné
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    351
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 351
    Par défaut
    Est-ce qu'il ne faudrait pas plutôt mettre $client->followRedirects(); plus tôt dans le code, par exemple avant le submit ? (enfin selon que tu souhaites faire, followRedirect() n'est pas identique à followRedirects(), cf. la doc partagée plus haut pour les explications)

    Après c'est à toi de voir ce que tu veux tester : soit tu suis la redirection et tu vérifies uniquement qu'à la fin tu termines bien sur un code 200 sur ta page liste, soit tu vérifies chaque étape avant d'arriver au même résultat (code 200 avec le header "Location" valorisé à "/users/usersList", "followRedirect()" pour suivre cette redirection, code 200 sur la page liste).

Discussions similaires

  1. Réponses: 1
    Dernier message: 23/01/2014, 15h25
  2. Réponses: 0
    Dernier message: 09/04/2008, 09h58
  3. Réponses: 2
    Dernier message: 24/10/2007, 12h55
  4. Doesnt exist in the current context
    Par sayag dans le forum C#
    Réponses: 4
    Dernier message: 15/06/2007, 11h04
  5. Réponses: 3
    Dernier message: 04/07/2006, 17h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo