2015-06-08 3 views
3

В огурце, с Rspec и Capybara У меня есть тест, чтобы проверить, что у кнопки есть класс. ЗдесьRspec с Capybara has_css matcher не работает

expect(@some_button).to have_css(".in-cart") 

это не удается, но

@some_button['class'] 

возвращает

'btn product in-cart' 

поэтому кнопка определенно имеет класс 'в тележке'.

В качестве временной меры я изменил мой тест, чтобы быть, -

expect(@some_button['class']).to match /in-cart/ 

Что явно безумен. Но зачем «has_css» или «has_css»? return false для элемента DOM, который явно имеет ожидаемый класс?

Кроме того, страница.all ('. In-cart') включает в себя кнопку, поэтому Capybara может ее определенно найти.

Кстати, я также попробовал 'button.in-cart', 'in-cart', ожидать (и т. Д.). To have_selector, ожидать (и т.д.has_selector? ('. In-cart')). Be_truthy и все комбинации.

+0

Что происходит, когда вы пытаетесь «ожидать (@some_button) .to have_css (« btn.product.in-cart »)' – Richlewis

ответ

6

have_css согласовани, как ожидается, будет применяться к родительскому контейнеру вместо фактического элемента

# your view 
<div id="container"> 
    <div class="in_cart product"></div> 
</div> 

# your step definition 
parent = page.find('div#container') 
expect(parent).to have_css(".in-cart") 
# => returns true, as there is nested div.in_cart 
expect('div#container div').to have_css(".in-cart") 
# => returns false, as there is no such selector inside of the latter div 

Как сращивания атрибутов точного объекта, вы должны придерживаться простого quering ключа

element = page.find('div#container div') 
element['class'].should include('in-cart') 
expect(element['class']).to match /in-cart/ 

То же самое относится ко всем RSpecMatchers.

-1

ожидать (страница) .то have_css ('button.in телега')

+0

Это не дает ответа на вопрос. Чтобы критиковать или просить разъяснения у автора, оставьте комментарий ниже их сообщения. – Jeeped

+1

да, это значит, что на странице есть кнопка с классом в корзине, и это именно то, что автор утверждает, что он хочет сделать –

+1

Похоже, что вы ищете всю страницу для любой кнопки с классом '. в-cart'. Я думал, что речь идет о проверке того, что * специальная * кнопка имела этот класс? –

1

В новых версиях Capybara/Rspec по умолчанию expect(page) будет запрашивать всю страницу, глядя на матч; однако иногда нам это может не нравиться, и вместо этого он будет ориентироваться на конкретный класс/область страницы. Для тех случаев, сузить контекст page с помощью within:

within('.container') do 
    expect(page).to have_css(".in-cart") 
end 

Предполагая, родитель имеет класс container Капибара будет искать только в пределах этого элемента.

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