キュウリの手順を再利用したいのですが、正しい方法が見つからないようです。
私は次のようなステップを書きたいです:
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
したがって、ユーザー認証のテストでは前者を使用できますが、他のほとんどの場所では後者を使用でき、実際にコードを再現する必要はありません。
他のステップを呼び出す方法はありますか、それともヘルパーメソッドにロジックを入れて、各タスクからメソッドを呼び出しますか(基本的にメソッド抽出リファクタリング、私の質問を読んだ後、実際にそれが最良の方法だと信じさせます)とにかく)?
[〜#〜] 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
機能内のすべてのシナリオでこれが必要な場合(または他の手順)、次のように一般的な手順で各機能に背景を追加することもできます。
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:in `block in '"。詳細については cucumber wiki をご覧ください。
変更の要点は、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
ステップ定義からステップを呼び出すことは悪い習慣であり、 いくつかの欠点 があります。
AslakHellesøy 推奨 ステップを再利用する代わりに、人気のアクションを World に抽出します。これらのアクションを1か所に分離し、このコードを見つけやすくします。通常の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
Cucumberメーリングリストの主題に関する有用な議論があります- link
ステップを引用符ではなく%{}で囲むのが最適です。その後、頻繁に使用する必要がある二重引用符をエスケープする必要はありません。
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
コードの再利用性を提供する機能ファイルのキーワードを再利用します。
Step defs内でstep 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 |
私のステップ定義では、(これは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とThenは、有効なシナリオと無効なシナリオの両方を処理します。同時に、機能ファイルは読者にとって意味があります。