2017-01-26 3 views
0

私のプロジェクトには複数の機能ファイルがあり、異なる機能が同じ背景設定を共有しています。現在、これらのバックアップ手順は機能ファイル全体に複製されます。これらの共通のステップを単一のフィーチャーに配置することができれば、ステップを一度指定して、それらを「サブ」フィーチャー・ファイルの先頭に指定し、フィーチャー全体のバックグラウンド・ステップの退屈な複製を基本的に停止することができます。私の検索からキュウリフィーチャファイルは、親フィーチャファイルから「継承」できますか?

は、私が「ステップ」の定義への参照を見つけた - 私が間違ってprobabltyがこれを解釈するんだけど、これはありません:

steps %{ 
    When I go to the search form 
    And I fill in "Query" with "#{query}" 
    And I press "Search" 
    } 
end 

はちょうど私の特徴ことを意味し、ステップ定義を複製します(ステップ '%{...} end'を追加した場合を除いて)今のやり方とほとんど同じに見えますか?

または、私が探しているのは、まったく不可能なことですか?

+0

それとも、これは私の願望に死を告げる鐘である: http://stackoverflow.com/questions/23832979/can-features-be-called-from-other-features-in-cucumber?rq=1 –

+0

あなたが言及したのはネストされたステップです...あなたのフィーチャファイルに複数のステップの代わりに1つのステップを書くだけで、継承の部分は完成しません。人々の多くは、このアプローチを使用しないことを提案します。どのようにこれらの手順のタグフィルタとの前にグローバルフックを使用しますが、これらがシナリオの動作に不可欠なものであれば、コードの重要なステップを隠すことはお勧めできません。 – Grasshopper

答えて

2

短い答え、いいえ。フィーチャファイルは別のフィーチャファイルから継承できません。

もっと長い答えは、多くの異なる実行で起こりたい共通セットアップがある場合、ステップが委任するヘルパークラスの設定を非表示にすることです。多くの場合、ステップの実装は実際に作業を実行する別のオブジェクトへの委任です。多くのステップは1行だけです。いくつかのものは長くなりますが、2〜3つ以上はめったにありません。

一般的な背景は、システムにログインすることです。ログインは重要ですが、多くの場合、ステップで非表示にすることができます。ステークホルダーは通常、そのようなことに気にしません。彼らはビジネス行動を気にする傾向があります。したがって、ログインのようなことを繰り返すことは、しばしばそれらの騒音であり、安全に抽象的に隠れることができます。

私のアプローチは、一般的なもの、おそらく重複をスタックに隠すことです。ステップの実装のどこかで非表示にしてください。

場合によっては状況が異なる場合があります。

+0

答えをありがとう。私は、私がさまざまなシナリオに取り掛かろうとしている「共通の」ポイントに私を連れて行くために、いくつかのセットアップステップが必要であるため、機能の背景を再現する必要があると思います。ヘルパークラスでこれらのステップを隠すことは可能かもしれませんが、1)セットアップのステップが不明瞭になり(また、些細なステップでもありません)、2)これらのステップ間でパラメータリストとマップを渡すことは、関係する20奇数のステップ –

1

フィーチャファイルは継承できません。これまでにフィーチャーファイルを使ったプログラミングをしようとしてはいけません!

これを行う方法は、あなたの共通の背景が何を

  1. 名前です。
  2. は、あなたが新しい名前を見つける追加のセットアップを必要とするように、その名前
  3. を指し
  4. はあなたの機能で何かを含め、その名前を使用して、ヘルパーメソッドを実装する新しいメソッドを作成し、それらを呼び出すことにより、既存の方法を使用してい

名前付け部分は機能にとって重要です。残りはプログラミングであり、フィーチャーには存在しません。

我々は既にユーザーを登録したら、あなたのモジュールの一部を取得するので今、あなたは、複雑さの任意のレベルにこのパターンを適用することができます

Scenario: Users can see their previous orders 
    Given I am signed in 
    When I view my orders 
    Then I should see my orders 

# steps 
Given 'I am signed in' do 
    sign_in user: @i 
end 

# Helper methods 
module SignInStepHelper 
    def sign_in(user:) 
    register(user) 
    ... 
    end 
end 
World SignInStepHelper 

にログインする機能を持っていると仮定すると、ログインの例を行うことができますスタックをプログラミング言語にして、複雑なレベルのプログラムを単一のメソッド呼び出しでプログラムすることができます。

秘密は、これをステップ定義よりも低いレベルで実行しているのです。これをネーミングと組み合わせれば、どんなレベルの複雑さにも対処できます。例えば

Scenario: Repeat order of monthly stationery 

Given I am registered 
And I have a monthly stationery order 
When I repeat my monthly order 
Then I should see my order in the checkout 
And I should see my previous orders 

# some steps 
Given 'I have a monthly stationery order' do 
    create_monthly_order(
    products: stationery_order, 
    user: @i 
) 
end 

# implementation 
module OrdersStepHelper 
    def create_monthly_order(products:, user:) 
    ... 
    end 

    def stationery_products 
    [ 
    ... 
    end 
end 

が今、明らかに存在この作業を行うために必要な多くのコードがあるが、これはステップの下に押し下げられているので、彼らの毎月の文房具のリピートオーダーをやって登録顧客との契約をすることができますこれは単なる簡単なプログラミングです。したがって、stationery_orderadd_stockなどのメソッドが必要です。しかし、この動作を実装するまでにBDDを実行している場合は、他の多くの処理が行われ、利用可能になります。私は

features 
step definitions 
step helpers 
application 

このスタックダウンさらにある心の中で階層構造を持っているcukingとき

私はより良い私の経験がなるものを行うコードをプッシュすることができます。

関連する問題