Как я могу получить доступ к переменной внутри многоступенчатого пошагового определения?

#ruby #selenium #cucumber

#ruby #selenium #cucumber

Вопрос:

В настоящее время я пытаюсь определить многоступенчатое пошаговое определение в Cucumber (для Ruby), но у меня возникают проблемы с использованием переменной на одном из подэтапов. Ниже я пытаюсь использовать переменную «policy_name» на последнем подэтапе, но не могу заставить Cucumber распознать ее по значению переменной, вместо этого он продолжает использовать ее как строку.

  Given("I should NOT be able to go back using the browser back button 
 after doing something {string}") do |policy|

   step 'I click on "something"'
   step 'I "do this" via computer'
   step 'I click on the browser back button'

   policy_name = case policy
   when "policy1" then "something1"
   when "policy2" then "something2"
   end

   step 'I should be on the "Specified" page 
   for #{policy_name}'
 end
  

Комментарии:

1. Я должен был упомянуть, что для Ruby используется Cucumber.

Ответ №1:

Вы используете одинарные или двойные кавычки? Двойные кавычки допускают интерполяцию, в то время как одинарные кавычки будут просто использовать содержимое без перевода каких-либо переменных. "#{policy_name}" должно работать, в то время как '#{any_variable}' не должно работать.

Ответ №2:

Не пишите шаги, подобные этому, и не вкладывайте шаги, вы просто попадете в беспорядок. Также данные предназначены для настройки состояния, а не для выполнения чего-либо.

Если у вас такой сложный шаг, у вас есть два лучших варианта, чем этапы вложения

  1. Разбейте шаг на более простые шаги
  2. Уберите сложность из определений шагов во вспомогательные методы

Выполнение таких шагов, как «Когда я нажимаю что-то», контрпродуктивно. Этот шаг полностью посвящен тому, как что-то делается. Сценарии должны быть о том, ЧТО вы делаете, и ПОЧЕМУ это важно. Функции и сценарии предназначены не для программирования, они предназначены для описания поведения и должны быть очень простыми. Итак, вы должны написать что-то вроде

 Scenario: When I foo then the back button is disabled
  Given ...
  When I foo
  Then the back button should be disabled
  

примером для моего банка может быть

 Scenario: Smile login disables back button
  Given I am logged into smile banking
  When I try and use the back button
  Then I should see the back button disabled warning
  

Наконец, определение каждого шага должно быть просто вызовом вспомогательного метода. например

 Given 'I am logged into smile banking' do
  # NOTE: both params are also helper methods
  login(site: smile_banking, user: create_user)
end
  

это позволяет перенести всю сложность из cucumber в код. Код может справиться со сложностью, Cucumber — нет.