Есть ли более простой способ написать следующий тест на огурец? - PullRequest
2 голосов
/ 28 сентября 2011

Я использую cucmber для тестирования приложения php, и на самом деле он работает довольно хорошо.

У меня есть функция cucmber, которая использует следующий шаг для проверки наличия ссылки на странице:

Then /^I should see a link that contains "(.+)"$/ do |link|
    assert !!(response_body =~ 
      /<a ([\w\.]*="[\w\.]*" )*href="(http:\/\/)?([\w\.\/]*)?(#{link})/m), response_body
end

Теперь это работает, но это ужасно и сложно.

Первоначально я пытался использовать вещь xpath:

response_body.should have_xpath("//a[@href=\"#{link}\"]")

Но тогда, если я проверю ссылку на«blah.com», тогда он не будет соответствовать «http://blah.com"» - что побеждает всю цель теста.Отсюда причина, по которой я переключился на регулярное выражение.

Так есть ли более простой способ написать тест, который не основан на сложных регулярных выражениях?

Cheers.

EDIT:После долгих потянув за волосы ... я нашел менее грязный способ найти изображения на своей странице:

response_body.should include(image)

Где строка изображения установлена ​​на что-то вроде 'myimage.png' - конечно,это прервется, если на странице будет настоящий текст «myimage.png», а не изображение.Должен быть лучший способ.Я рассматривал Hpricot, чтобы посмотреть, смогу ли я разобрать html и вытащить атрибут, который хочу протестировать, а затем протестировать его с помощью регулярного выражения, но все это выглядит так ... раздуто.

Ответы [ 2 ]

1 голос
/ 28 сентября 2011

Примерно так должно работать:

response_body.should have_css("a[href*='#{link}']")

См. Это для деталей: http://www.w3.org/TR/css3-selectors/#attribute-substrings

EDIT: Похоже, эквивалентным методом для webrat является have_selector, поэтому:

response_body.should have_selector("a[href*='#{link}']")
0 голосов
/ 29 сентября 2011
Then /^I should see the image "(.+)"$/ do |image|    
  response_body.should have_selector("img[src*='#{image}']")
end

Then /^I should see a link that contains "(.+)"$/ do |link|    
  response_body.should have_selector("a[href*='#{link}']")
end

Спасибо AlistairH - ваш совет сработал!:)

Я до сих пор не понимаю, почему он ищет html с синтаксисом css-селектора, но, возможно, это был просто дизайнерский выбор, который они написали, потому что это выглядело проще, чем регулярное выражение...?Я не знаю.

...