#ruby-on-rails #regex #cucumber
#ruby-on-rails #регулярное выражение #cucumber
Вопрос:
Я создал пользовательский шаг cucumber для проверки назначения ссылки, и я использую новую встроенную поддержку Cucumber в web_steps для определения области этих поисковых запросов. Итак, у меня есть два шага cucumber:
# My step to verify the link
Then /^"([^"]*)" should link to (.*)$/ do |link_text,page_name|
page.should have_link(link_text, :href => path_to(page_name))
end
# Cucumber's built in step to scope things
# Single-line step scoper
When /^(.*) within ([^:] )$/ do |step, parent|
with_scope(parent) { When step }
end
Я использую это, используя скрипты cucumber, которые выполняют такие вещи, как
And "home" should link to the home page within the "Email Signature" section
Моя проблема в том, что я получаю неоднозначные совпадения в приведенном выше между этими двумя шагами, потому что предложение ‘within’ нельзя отличить от «домашней страницы», потому что у последней нет никаких ограничивающих кавычек.
Я попытался изменить шаг ссылки, чтобы читать следующим образом, думая, что это может устранить двусмысленность, не сопоставляя ‘within’, но я думаю, что ‘within’ вместо этого поглощается предшествующей группой:
Then /^"([^"]*)" should link to (.*)(?!within)$/ do |link_text,page_name|
page.should have_link(link_text, :href => path_to(page_name))
end
Есть мысли о том, как это решить?
Комментарии:
1. Привет, Qtax — извините, у меня еще не было возможности попробовать — не волнуйтесь, я попробую 🙂
Ответ №1:
Это не прямой ответ на вопрос, который я задал (для этого см. Ответ Qtax), но вот что я в итоге делаю. Я думаю, что в любом случае это более приятное решение, чего бы оно ни стоило…
Я создал пользовательскую версию помощника по определению области действия, которая выглядит следующим образом:
Then /^within ([^,]*), (. )$/ do |parent, step|
with_scope(parent) { When step }
end
Это позволяет мне писать шаги, подобные этому:
And within the "Email Signature" section, "home" should link to the home page
Которое, я думаю, (а) читается более естественно (понятнее, что мы говорим о ссылке, находящейся в разделе подписи электронной почты, а не на домашней странице), и (б) решает проблему, с которой я столкнулся, потому что селектор «внутри» без кавычек находится далеко от названия страницы без кавычек.
Ответ №2:
Попробуйте что-то вроде:
/^"([^"]*)" should link to ((?:(?!within).) )$/
Ничего не знаю о Cucumber, я просто придерживаюсь того, что вы пытались сделать.
Комментарии:
1. Отлично, спасибо @Qtax, отлично работает 🙂 Извините, что потребовалось так много времени для его тестирования — я случайно сломал свою сборку, делая что-то еще, и мне пришлось сначала это исправить! P.S. Нашел другое решение / обходной путь, который, как мне кажется, я предпочел в конце, о котором я расскажу в отдельном ответе ниже.