QA@IT

同じステップ名でフューチャ毎に違う処理をさせたい

2620 PV

質問

以下のような形の実現方法はありますか。

features
|-- gamen1.feature
|-- gamen2.feature
|-- step_definitons
|   `-- gamen1_steps.rb
|   `-- gamen2_steps.rb
|   `-- global_steps.rb
`-- support
    `-- env.rb

ってなってる時、gamen1.feature 実行中は gamen1_steps.rb のステップだけ呼ばれて、
共通のステップは globaL_steps.rb に書く、みたいな。

現状

# gamen1.feature
Feature: 画面A
  Scenario: 一覧画面から詳細画面に遷移する
    Given 画面Aにアクセスする
    When  一覧から"hoge"リンクをクリックする
    Then  "hoge"の詳細画面が表示される
# gamen2.feature
Feature: 画面B
  Scenario: 一覧画面から詳細画面に遷移する
    Given 画面Bにアクセスする
    When  一覧から"fuga"リンクをクリックする
    Then  "fuga"の詳細画面が表示される

という二つの feature があって、それぞれが持つ When Step の定義が下記の通りだとします。

When /^一覧から"([^\"]*)"リンクをクリックする$/ do |name|
  find(table.xpath(name)).click # ここらへんは雰囲気
end

この時、画面Aと画面Bで一覧テーブルに対する xpath が違う場合の対処方法を悩んでいます。

※ もちろんテーブルだけじゃなくてその他もろもろ

だめっぽい時は

いくつか対処案を考えてはいます。というかそうすべきものかもしれません。

対処案1

素直に同じにする。対象テーブル全て table#list にするとか

対処案2

タグ付けする。

  @gamen1
  Scenario: 一覧画面から詳細画面に遷移する
    Given 画面Aにアクセスする
    When  一覧から"hoge"リンクをクリックする
    Then  "hoge"の詳細画面が表示される

  @gamen2
  Scenario: 一覧画面から詳細画面に遷移する
    Given 画面Bにアクセスする
    When  一覧から"fuga"リンクをクリックする
    Then  "fuga"の詳細画面が表示される

とかして

Before '@gamen1' do
  World(Project::Gamen1)
end

Before '@gamen2' do
  World(Project::Gamen2)
end

みたいな。あとはそれぞれで table.xpath の処理を変えるとか。

対処案3

ステップ名に画面名を入れる

When /^画面Aの一覧から"([^\"]*)"リンクをクリックする$/ do |name|
  # ...
end

When /^画面Bの一覧から"([^\"]*)"リンクをクリックする$/ do |name|
  # ...
end

対処案2,3共に画面が増えれば増えるほどカオス

素直に対処案1 かな・・・

回答

(直接の回答ではありません)

Capybara の作者が作った turnip という gem があります。Cucumber では難しい、コンテキストに応じた step definition の使い分けや状態の共有をサポートしているので、ご質問のような状況にはぴったりかもしれません。

編集 履歴 (0)
  • 回答ありがとうございます。turnip、理想にかなり近いです。cucumber からの移行を、実際に書いてみて感触を掴んでみようと思います。 -
ウォッチ

この質問への回答やコメントをメールでお知らせします。