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

我想写一个步骤,如:

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

所以在试验的用户身份验证我就可以用前者,但大多数其他地方,我可以使用后者,并没有实际必须重现代码。

有没有办法调用其他步骤,或者我只是把逻辑中的一个辅助方法,并呼吁所述方法从每项任务(基本上是一个方法提取的重构,其中,在阅读我的问题使我相信这是实际的最佳方式无论如何)?

有帮助吗?

解决方案

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

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

如果所有的特征内的情景的需要这个(或其他步骤),也可以加一个背景各特征,与所述共同的步骤,像这样:

Background:
  Given I log in with valid credentials

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

其他提示

请注意,对于调用步骤中的步骤的方法在最新版本的黄瓜,而如果你得到“警告错误你会看到发生了变化:使用‘鉴于/时/那么’步骤定义已经过时,用'步骤“来调用其他步骤来代替:/path/to/step_definitions/foo_steps.rb:631:在`块” ”请参阅黄瓜维基获得的信息。

的变化的要点是,你现在应该使用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

呼叫距离步骤的定义是一个不好的做法和有 有些缺点:

  1. 如果方案将会失败和有嵌套的步调,将只得到最后援引的步骤定义在栈踪。它可能难以从中找到的地方去stepdef被称为
  2. 呼叫stepdef是有时很难找到和读取比红宝石的方法
  3. 红宝石的方法给你更多的权力比呼吁步步骤定义

阿斯拉克Hellesøy 建议 提取受欢迎的行动 世界 而不是重复使用的步骤。它隔离这些行动在一个地方,使这个代码更容易找到。你可以取代通常的红宝石的课程或模块。

#/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

这是一个有用的有关问题的讨论在黄瓜的邮件列表 链接

最佳包裹在%{},而不是你的报价步骤。然后,你不需要逃避它,你需要经常使用双引号:

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

在功能文件复用的关键字,将提供代码的可重用性。

强烈不推荐调用步骤DEFS内步骤DEFS。

我会这样写我的特征文件,

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       |

在我的步骤的定义,(这是爪哇)

@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
    }
}

在这种方式,有很多代码的可重用的。 你同样给药,然后同时处理有效和无效的情形。 与此同时,您的特性文件是有道理的,以飨读者。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top