2016-08-17 2 views
0

У меня есть следующий тест:Запуск тестов на нескольких объектах

expect(page).to have_selector('ul', count: 1) 
expect(page).to have_selector('li', count: 21) 
expect(page).to have_selector('li img', count: 21) 

В основном я хочу, чтобы проверить, что список существует, что оно имеет ровно 21 пунктов и что каждый элемент имеет изображение.

Проблема с моим кодом заключается в том, что если первый элемент имеет 2 изображения, а второй - нет, он все равно пройдет.

Как я могу проверить каждый элемент списка отдельно? Что-то вроде этого ...

expect(page).to have_selector('ul', count: 1) 
expect(page).to have_selector('li', count: 21) 
foreach('li') do |item| 
    expect(item).to have_selector('img', count: 1) 
end 

ответ

2

Ответ на Florent B. правильно и тесты, что вы хотите. Для того, чтобы чеки, как вы думали, вы могли бы сделать что-то вроде

expect(page).to have_selector('ul', count: 1) 
lis = page.all('li', count: 21) # same effect as expectation since it will raise an exception if not 21 on page but gets access to the elements 
lis.each do |li| 
    expect(li).to have_selector('img', count: 1) 
end 

однако из-за количества запросов, которые будут выполнять ответ на Флорана Б. будет гораздо быстрее

1

я бы просто проверить с помощью XPath, что нет li где отсчет изображение не 1:

expect(page).to have_selector('ul', count: 1) 
expect(page).to have_selector('ul li', count: 21) 
expect(page).to have_selector('ul li img', count: 21) 
expect(page).to have_no_xpath('//ul//li[count(.//img) != 1]') 
+0

Существовал нет ' has_no_xpath'. Был «has_no_xpath?», Но когда я его использую, я получаю «синтаксис ожидания», который не поддерживает сопоставления операторов, поэтому вы должны передать совпадение в «# to». –

+1

@Dbugger должно быть 'has_no_xpath' –

+0

@Tom Walpole, спасибо за исправление. –

Смежные вопросы