如何在多步骤步骤定义中访问变量?

时间:2019-03-06 19:56:35

标签: 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

2 个答案:

答案 0 :(得分:0)

您使用单引号还是双引号?双引号允许插值,而单引号仅使用内容而不转换任何变量。 "#{policy_name}"应该有效,而'#{any_variable}'应该无效。

答案 1 :(得分:0)

不要编写这样的步骤,也不要嵌套步骤,您只会陷入混乱。同样,给出的是建立状态的,而不是做某事的。

如果您有类似这样的复杂步骤,那么与嵌套步骤相比,您有两个更好的选择

  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无法处理。