黄瓜,从其他步骤调用步骤。最佳做法?

时间:2015-12-09 21:01:46

标签: cucumber gherkin

我今天和一位同事进行了深入的讨论。是否从另一个被认为是最佳实践的步骤开始? 所以,例如:

Given /a turtle/ do
  puts "turtle!"
end

Given /two turtles/ do
  step "a turtle"
  step "a turtle"
end

在我看来,这意味着如果不检查整个项目,就无法更改要素文件。因此,如果我想保持DRY,我更喜欢使用从这些步骤调用的“代码”功能(即在Ruby中)。

def turtle do
   puts "turtle!"
end

Given /a turtle/ do
  turtle
end

Given /two turtles/ do
  turtle
  turtle
end

如果我别无选择,我甚至更愿意复制代码而不是调用其他步骤。

Given /a turtle/ do
  puts "turtle!"
end

Given /two turtles/ do
  puts "turtle!"
  puts "turtle!"
end

什么是最佳做法?为什么?

2 个答案:

答案 0 :(得分:2)

嵌套步骤是一种非常糟糕的做法。如果你这样做,你很快就会陷入困境。一个好的步骤定义是对方法的一行调用。其他任何事情都会很快变得混乱

考虑:

   When "I login" do
      visit login_path
      fill_in ...
      ...
      submit
   end

   When "I login as as admin" do
     visit admin_login_path
     fill_in ...
     ...
   end

看看有多重复。现在你可以通过逐步嵌套和传递参数来删除它,但是你最终会得到一个很难调试的非常复杂的步骤定义,所以只需调用一个辅助方法

   When "I login" do
     login user: @i
   end

   When "I login as an admin" do 
     login user: @i, role: admin
   end

我们在这里做的是仅使用步骤定义来完成一个简单的任务,将场景中的一行转换为方法调用。现在所有复杂的东西都采用标准方法。编程语言非常适合处理复杂性。当我们编写登录方法时,我们将拥有各种工具和技术,因此我们可以在保持代码干燥的同时管理任何复杂性。

答案 1 :(得分:0)

最好像这样使用

<强>功能

Given "2" turtles

步骤定义

Given / "(\d+)" turtles/ do | count |
  count.times.do
    puts "turtle!"
  end
end