题
我要重复使用的一些黄瓜的步骤,但似乎无法找到正确的方式。
我想写一个步骤,如:
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:在`块” ”请参阅黄瓜维基获得的信息。
的变化的要点是,你现在应该使用step
或steps
方法。
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
呼叫距离步骤的定义是一个不好的做法和有 有些缺点:
- 如果方案将会失败和有嵌套的步调,将只得到最后援引的步骤定义在栈踪。它可能难以从中找到的地方去stepdef被称为
- 呼叫stepdef是有时很难找到和读取比红宝石的方法
- 红宝石的方法给你更多的权力比呼吁步步骤定义
阿斯拉克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
}
}
在这种方式,有很多代码的可重用的。 你同样给药,然后同时处理有效和无效的情形。 与此同时,您的特性文件是有道理的,以飨读者。