Неоднозначность шага Cucumber при использовании встроенного «внутри» step scoper

#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. Нашел другое решение / обходной путь, который, как мне кажется, я предпочел в конце, о котором я расскажу в отдельном ответе ниже.