2009-05-27 141 views
94

我想重用一些黄瓜步骤,但似乎无法找到正确的方法。重复使用黄瓜步骤

我想写像步:

Given /^I login with (.*) credentials$/ |type| 
    # do stuff with type being one of "invalid" or "valid" 
end 

但后来有这样一个步骤:

Given /^I login successfully$ 
    # call "Given I login with valid credentials" 
end 

所以在测试中的用户身份验证,我可以使用前者,但大多数其他地方,我可以使用后者,而实际上不必重新编码。

有没有办法调用另一个步骤,或者我只是把逻辑放在一个辅助方法中,并从每个任务调用所述方法(基本上是一个方法提取重构,在阅读我的问题后,我相信这是实际上反正是最好的方式)?

+1

如果有人感到困惑,那么这里的每个人都会抛弃在Ruby步骤定义中启动`do ... end`块所需的`do`。这实际上是必需的。 – 2014-10-27 21:47:47

回答

98

UPDATE:下面描述的方法已被弃用。推荐的方法到现在从另一个步骤中调用一个步骤是这样的:

Given /^I login successfully$/ 
    step "I login with valid credentials" 
end 

旧,不建议使用方法(供参考):

您还可以从这样的其他步骤步骤:

Given /^I login successfully$/ 
    Given "I login with valid credentials" 
    Then "I should be logged in" 
end 

如果所有要素中的场景都需要这个(或其他措施),你也可以添加背景各的特点,与日E共有步骤,比如:

Background: 
    Given I log in with valid credentials 

Scenario: Change my password 
    Given I am on the account page 
+4

更容易粘贴小黄瓜代码,如下所示:`步骤%Q {给定我已登录}` – BrendanDean 2011-08-09 18:42:54

+1

@BrendanDean当这个答案被接受时,`steps`方法不存在。请参阅下面的答案。 – michaeltwofish 2011-12-07 06:25:35

+6

这种方式已被弃用 – Karan 2012-04-09 01:38:09

101

注意,调用步骤中的步骤的方法在最新版本的黄瓜,而如果你得到“警告错误你会看到发生了变化:使用“鉴于/时/ Then'在步骤定义中已被弃用,请使用'step'来调用其他步骤:/path/to/step_definitions/foo_steps.rb:631:在' '的块中。详情请参阅cucumber wiki

变更的要点是,您现在应该使用stepsteps方法。

When /^I make all my stuff shiny$/ 
    step "I polish my first thing" 
end 

When /^I make all my stuff shiny$/ 
    steps %Q{ 
    When I polish my first thing 
    When I shine my second thing 
    } 
end 
+16

值得一提的是,经过更多的时间与黄瓜,我建议不要在步骤内使用步骤。问题难以追查,实际上使维护变得更加困难。相反,使用助手方法。 – michaeltwofish 2012-10-10 23:42:06

8

最好用%{}而不是引号括住你的步骤。然后,你不需要逃避它,你需要经常使用双引号。:

Given /^I login successfully$ 
    step %{I login with valid credentials} 
end 

Given /^I login with (.*) credentials$/ |type| 
    # do stuff with type being one of "invalid" or "valid" 
end 
40

调用步骤定义的步骤是一个不好的做法,并具有some disadvantages

  1. 如果场景将失败并且存在嵌套的步骤调用,则只会获取堆栈跟踪中最后一个调用的步骤定义。这可能是很难找到哪个地方,去年stepdef被称为
  2. 电话stepdef有时是很难发现和阅读比Ruby方法
  3. Ruby方法给你更多的权力比调用步骤DEFS步骤

AslakHellesøyrecommends将热门操作提取到World而不是重复使用步骤。它将这些操作隔离在一个地方,使代码更容易找到。您可以将代码提取到常见的Ruby类或模块中。

#/support/world_extensions.rb 
module KnowsUser 
    def login 
    visit('/login') 
    fill_in('User name', with: user.name) 
    fill_in('Password', with: user.password) 
    click_button('Log in') 
    end 

    def user 
    @user ||= User.create!(:name => 'Aslak', :password => 'xyz') 
    end 
end 
World(KnowsUser) 

#/step_definitions/authentication_steps.rb 
When /^I login$/ do 
    login 
end 

Given /^a logged in user$/ do 
    login 
end 

下面是对黄瓜邮件列表的主题了有益的探讨 - 在功能文件link

1

重用的关键字将提供代码的重用。

极力不建议在步骤定义中调用步骤定义。

我会写我的功能文件这样,

Scenario Outline: To check login functionality 
    Given I login with "<username>" and "<password>" 
    Then I "<may or may not>" login successfully 

Examples: 
    |username|password|may or may not| 
    |paul |123$ |may   | 
    |dave |1111 |may not  | 

在我的步骤定义,(这就是Java)

@Given(I login with \"([^\"]*)\" and \"([^\"]*)\"$) 
public void I_login_with_and(String username, String password){ 

    //login with username and password 

} 

@Then(I \"([^\"]*)\" login successfully$) 
public void I_login_successully_if(String validity){ 

    if(validity.equals("may")){ 
     //assert for valid login 
    } 
    else 
    if(validity.equals("may not")){ 
     //assert for invalid login 
    } 
} 

这样,有很多代码的可重用的。 您和Given一样,然后处理有效和无效的情况。 同时,您的功能文件对读者有意义。