#ruby-on-rails #cucumber
#ruby-on-rails #огурец
Вопрос:
Я унаследовал приложение Rails, но незнаком с этой конкретной тестовой средой. Когда выполняются тесты cucumber, мы получаем:
Scenario: Add only an image to a profile by url # features/add_an_image_by_file_url.feature:11
Given I am logged in as a user "admin" # features/step_definitions/user_steps.rb:19
And I create a profile for "Joe Blogs" # features/step_definitions/profile_steps.rb:1
And I have a fake image url "http://fake.com/images/profile.jpg" # features/step_definitions/photo_steps.rb:1
When I follow "New photo" # features/step_definitions/web_steps.rb:32
And I fill in "Url" with "http://fake.com/images/profile.jpg" # features/step_definitions/web_steps.rb:38
And I press "Create" # features/step_definitions/web_steps.rb:26
Then I should see "Photo was successfully uploaded." # features/step_definitions/web_steps.rb:99
And I should see "profile.jpg" within first profile item # features/step_definitions/item_steps.rb:18
Unable to find css "ul#items li:first" (Capybara::ElementNotFound)
(eval):2:in `find'
./features/step_definitions/web_steps.rb:13:in `with_scope'
./features/step_definitions/web_steps.rb:100:in `/^I should see "([^"]*)"(?: within "([^"]*)")?$/'
features/add_an_image_by_file_url.feature:19:in `And I should see "profile.jpg" within first profile item'
Это взято из item_steps:
Then /^I should see "([^"]*)" within (.*?) profile item$/ do |string, filter|
Then %Q{I should see "#{string}" within "ul#items li:#{filter}"}
end
И соответствующие веб-шаги:
Then /^I should see "([^"]*)"(?: within "([^"]*)")?$/ do |text, selector|
with_scope(selector) do
if defined?(Spec::Rails::Matchers)
page.should have_content(text)
else
assert page.has_content?(text)
end
end
end
Рассматриваемый HTML выглядит следующим образом:
<ul id='items'>
<li class='note clearfix'>
<div class='content'>
<img src="profile.jpg"/>
</div>
</li>
</ul>
Что, черт возьми, здесь происходит?
Ответ №1:
Ну, «что здесь происходит» довольно просто:
- cucumber выполняет каждый шаг сценария, используя соответствующее определение шага
- все идет нормально, пока
- он выполняет «Я должен увидеть»profile.jpg «внутри первого элемента профиля»
- на этом шаге cucumber переходит к соответствующему определению шага в item_steps
- это определение в item_steps вызывает другое определение шага из web_steps
- этот последний проверяет, действительно ли страница содержит заданный контент в заданной области
- и проверка завершается неудачей…
Я полагаю, интересный вопрос заключается в том, «почему это не работает». Очень похожий css-селектор отлично работает для меня, когда я использовал его в моем сценарии cucumber / capybara.
Вы уверены, что HTML-код действительно отображается в браузере? В шаблоне или в контроллере нет условий, которые могли бы помешать его отображению? Что происходит, когда вы меняете ‘ul#items li:first’ на что-то более простое, скажем, просто ‘ul#items’?
Обновление: проблема действительно очень проста: profile.jpg ЭТО НЕ текстовое содержимое — это «невидимый» HTML-код. Единственная ошибка, которая у вас есть, — это сам сценарий.
Комментарии:
1. Спасибо за ваш ответ. Я возился с веб-сайтом, переходя с CarrierWave на Paperclip из-за какой-то странной ошибки «не удается скрыть nil в строку». Хотя тест не пройден, сайт разработки работает нормально, если щелкнуть его вручную. Я подозреваю, что что-то не так с тем, как он настроен, но я не был так усерден с TDD, как следовало бы. Ошибка моего пути теперь сильно беспокоит меня, поскольку я нахожу совершенно новую область обучения.
2. Что ж, есть 2 возможные причины описанной вами проблемы: (1) capybara работает некорректно и (2) ваша среда cucumber не соответствует вашей среде разработки в каком-то важном аспекте. первую причину должно быть легко диагностировать, вторую — легко исправить.
3. Еще раз привет. Спасибо за вашу помощь. Похоже, что Capybara работает. У меня есть последняя версия gem, и она запускает Safari с доступными для просмотра версиями файлов сайта. Среды разработки и тестирования находятся на моем macbook, и, поскольку я использую Rails 3 и bundler, это не должно быть проблемой.
4. Вы пытались упростить «ul#items li: #{filter}» -> «ul#items»?
5. О боже, это было так очевидно! «profile.jpg «это просто не текстовое содержимое! Извините за подробный дискурс вместо короткого ответа. Я обновил свой ответ.