Я хочу проверить, правильно ли работает моя сортировка с 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?
Не решение для вашего конкретного вопроса, а обходной путь для вашей проблемы:
Вы могли бы перечислить ваши 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');
Я опаздываю на вечеринку здесь, но я использовал ниже, чтобы проверить порядок элементов на странице. Кажется, до сих пор так хорошо получается.
Реализуйте метод ниже на вашем 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
]);
}
Итак, я решил это. Ключ должен был заглянуть в \ 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');