Порядок проверки элементов Laravel на странице

Я хочу проверить, правильно ли работает моя сортировка с Laravel TestCase. У меня есть простая тестовая страница:

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

И теперь я хочу проверить, если первый .тест-класс элемент содержит ‘Value1’. Я пробовал разные подходы и не имел успеха. Вот первый из них:

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

Это привело к исключению:

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

Потом я попробовал

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

и мой тест, когда зеленый. Но он должен быть красным, потому что первый ребенок ‘Value1’. Это полностью игнорируется ‘:Первый ребенок’ часть.

Потом я попробовал

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

и получил зеленый тоже. Так что этот подход тоже не работает.

Я что-то пропустил? Или нет способа проверить порядок элементов на странице с помощью тестов Laravel?

0

Решение

Не решение для вашего конкретного вопроса, а обходной путь для вашей проблемы:
Вы могли бы перечислить ваши test-class делится с $loop->iteration Вспомогательная переменная, которая содержит номер текущей итерации цикла.

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

Теперь у ваших классов div есть нумерованный идентификатор, начинающийся с 1, и вы можете использовать селектор #value_1 в вашем тесте выберите первый div:

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

Другие решения

Я опаздываю на вечеринку здесь, но я использовал ниже, чтобы проверить порядок элементов на странице. Кажется, до сих пор так хорошо получается.

Реализуйте метод ниже на вашем TestCase Базовый класс.

/**
* Given a CSS selector string, check if the elements matching the query
* contain the values provided, in the order they are provided.
*
* @param string $selector
* @param array $contents
* @return $this
*/
public function seeInOrder($selector, Array $contents)
{
$matches = $this->crawler->filter($selector);

try {
foreach ($matches as $index => $domElement) {
$needle = $contents[$index];
$this->assertContains($needle, trim($domElement->textContent));
}
} catch (PHPUnit_Framework_ExpectationFailedException $e) {
$this->fail('Failed asserting that the element at index ' . $index . ' contains the string "' . $contents[$index] . '"');
}

return $this;
}

Использование:

/**
* Test that the /books route returns a list of books in explicit order.
*
* @test
* @return void
*/
public function books_index_page_lists_books_in_explicit_order()
{
$book_1 = factory(App\Book::class)->create([
'order' => 0
]);

$book_2 = factory(App\Book::class)->create([
'order' => 1
]);

$this->visit('/books')
->see($book_1->title)
->see($book_2->title)
->seeInOrder('.books .book', [
$book_1->title,
$book_2->title
]);
}
1

Итак, я решил это. Ключ должен был заглянуть в \ Symfony \ Component \ DomCrawler \ Crawler учебный класс. У него есть много полезных методов, таких как первый(), прошлой() или же э ($ число). Я создал этот метод в моем Прецедент учебный класс:

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

return $this;
}

Вы можете избавиться от отделка() функция, но с этим вывод выглядит лучше в случае неудачного теста.
Итак, в своих тестах я использую такие конструкции для проверки порядка:

$this->seeInFirstElement('.test-class', 'Value1');
0
По вопросам рекламы [email protected]