2017-03-24 1 views
0

Je veux tester si mon tri fonctionne correctement avec Laravel TestCase. J'ai la page de test simple:Laravel ordre des elemets sur la page

<div id="values"> 
    @foreach(['Value1', 'Value2'] as $value) 
     <div class="test-class">{{$value}}</div> 
    @endforeach 
</div> 

Et maintenant je veux tester si le premier élément .test classe contient 'valeur1'. J'avais essayé différentes approches et n'ai pas eu de succès. Voici une première:

public function testSorting() 
{ 
    $this->visit(route('dummy')); 
    $this->see('Value1'); 
    $this->seeInElement('.test-class:first-of-type', 'Value2'); 
} 

Celui-ci a donné lieu à exception:

Symfony\Component\CssSelector\Exception\ExpressionErrorException: "*:first-of-type" is not implemented. 

Alors j'ai essayé

$this->seeInElement('#values:first-child', 'Value2'); 

et mon test quand il est vert. Mais il devrait être rouge, car le premier enfant est 'Value1'. Il a totalement ignoré la partie ': first-child'.

Alors j'ai essayé

$this->seeInElement('#values:nth-child(1)', 'Value2'); 

et obtenu trop vert. Donc, cette approche ne fonctionne pas non plus.

Ai-je manqué quelque chose? Ou il n'y a aucun moyen de tester l'ordre des éléments sur la page avec des tests Laravel?

Répondre

0

Alors, je l'ai résolu. La clé était de regarder dans la classe \ Symfony \ Component \ DomCrawler \ Crawler. Il a beaucoup de méthodes utiles comme d'abord(), dernier() ou eq (numéro $). J'ai créé cette méthode dans mon TestCase Classe:

public function seeInFirstElement($selector, $text) 
{ 
    $this->assertContains($text, trim($this->crawler->filter($selector)->first()->text())); 

    return $this; 
} 

Vous pouvez vous débarrasser de trim() fonction mais avec elle la sortie semble mieux en cas de test a échoué. Ainsi, dans mes tests j'utilise de telles constructions pour tester la commande:

$this->seeInFirstElement('.test-class', 'Value1'); 
1

pas une solution pour votre question, mais une solution pour votre problème: Vous pouvez énumérer vos test-class divs avec la variable d'aide $loop->iteration, qui contient le numéro de l'itération de boucle de courant.

<div id="values"> 
    @foreach(['Value1', 'Value2'] as $value) 
     <div class="test-class" id="value_{{$loop->iteration}}">{{$value}}</div> 
    @endforeach 
</div> 

maintenant vos classes div id ont un dénombrée en commençant par 1 et vous pouvez utiliser le sélecteur #value_1 dans votre test pour sélectionner le premier div:

$this->seeInElement('#value_1', 'Value2');