2017-02-01 12 views
0

私の目標

私は大規模なアプリケーションのための機能やステップの定義のスケーラブルな構造を作成しようとしていますし、私の最初のショットは、私は別のステップの定義については、同一のステップパターンを使用することができるような機能にstep_definitionファイルをリンクしようとしていました。cucumber-jsの各機能ファイルのステップ定義ファイルはどのように指定できますか?

マイコード

私は私の現在の例を示しています。私は私のsample.feature

/features/sample.feature 
/features/example.feature 
/features/step_definitions/sample_steps.js 
/features/step_definitions/example_steps.js 
/features/step_definitions/common/common_steps.js 

::私は私のexample.feature

Scenario: Launching Cucumber 
    Given I have some step definitions 
    When I check some step definition with parameter "any" 
    Then I should see all green "sample" 

を:

マイフォルダ構造を

Scenario: Launching Cucumber 
    Given I have some step definitions 
    When I check some step definition with parameter "any" 
    Then I should see all green "example" 

GivenWhenの手順は、/common/common_steps.jsファイルで定義されており、正常に動作します。

Thenのステップは、sample_steps.jsexample_steps.jsの両方に定義されていますが、異なっています。私が持っている私のsample_steps.jsで

Then('I should see all green {stringInDoubleQuotes}', (arg) => { 
    if (arg !== 'sample') { 
    throw 'I should see all green when the argument is "sample"'; 
    } 
    return; 
}); 

そして、最後に、私が持っている私のexample_steps.js中:

Then('I should see all green {stringInDoubleQuotes}', (arg) => { 
    if (arg !== 'example') { 
    throw 'I should see all green when the argument is "example"'; 
    } 
    return; 
}); 

エラー

私の主な目標は持っていることですすべてここで緑色ですが、もちろん動作しません。私はこのobvioulyエラーを受け取ります。

Multiple step definitions match: 
    I should see all green {stringInDoubleQuotes} - features\step_definitions\example_steps.js:6 
    I should see all green {stringInDoubleQuotes} - features\step_definitions\sample_steps.js:6 

キュウリ、JVMは

私はキュウリ、JVMで、我々は機能とstep_definitionsをリンクglue属性を指定することができ、それは私が探しているまさにだが、キュウリ-jsからであることを知っています。 Javaでの例:

@RunWith(Cucumber.class) 
@Cucumber.Options(glue = { "com.app.stepdefinitions.common", "com.app.stepdefinitions.sample" }) 
public class SampleFeature{ 
} 

@RunWith(Cucumber.class) 
@Cucumber.Options(glue = { "com.app.stepdefinitions.common", "com.app.stepdefinitions.example" }) 
public class ExampleFeature{ 
} 

最後に

どのように私はキュウリ-JSを使用してcucumbr-JVMと同じように達成することができますか?

答えて

1

は、あなただけのこの操作を行うことはできません:より大きなコードベースのステップの定義と

Then('I should see all green "sample"',() => { 
    return; 
}); 


Then('I should see all green "example"',() => { 
    return; 
}); 

事は多くのステップは非常に類似していることです。つまり、「ページ」に移動します。コードを共通の場所に置き、URLを別の場所に置くことができます。

Then('I should see all green "(.*)"', (arg) => { 

// DO SOME COMMON STUFF 

arg = arg.toLowerCase(); 
if(arg === "sample"){ 
    // DO SAMPLE OWN STUFF 
}else if(arg === "example"){ 
    // DO EXAMPLE STUFF 
} 

// CARRY ON WITH COMMON STUFF 
}); 

をしかし、これは非常に長い得ることができます:

個人的に、私はこれを行うだろう。彼らが全く異なることをするならば、最初の選択肢に行きます。同じことをするなら、2つ目の方法を使います。

それは実際にあなただけのこの操作を行う必要があるということがあります。私はそれを行うことの道を見つけた

Then('I should see all green "(.*)"', (arg) => { 

// DO SOME COMMON STUFF 
arg = arg.toLowerCase(); 
var result = runTheseSteps(arg); 

// CARRY ON WITH COMMON STUFF 
}); 

EDIT。それはあなたの要件の一部ではない一般的な機能です(ごめんなさい)が、それはそれが動作するようにする唯一の方法かもしれないと信じています。あなたのステップの定義では

this.Before(function (scenario, callback) { 
    var tags = []; 
    for(var i=0;i<scenario.getTags().length; i++){ 
     tags[i] = scenario.getTags()[i].getName(); 
    } 
    global.scenarioTags = tags.join(", "); 
    callback(); 
}); 

:あなたのフックで

this.Given(/^I should see all "(.*)"$/, function (arg) { 

    if (scenarioTags.includes("@sample") != null) { 
     // DO THE SAMPLE STUFF 
    } else { 
     // DO THE EXAMPLE STUFF 
    } 
}); 

それはあなたのステップ定義ジェネリック残しながら、それはあなたがいる限り、二重引用符の中に何かを入れて、できることを意味しますシナリオにタグを付けると、正しいコードが実行されます。

@sample 
    Scenario: Launching Cucumber 
    Given I have some step definitions 
    When I check some step definition with parameter "any" 
    Then I should see all green "sample" 

@example 
    Scenario: Launching Cucumber 
    Given I have some step definitions 
    When I check some step definition with parameter "any" 
    Then I should see all green "example" 
+0

よく...私は、手順が複雑すぎるため引数を受け取るスーパー汎用メソッドを避けたいと思います。あなたの最初の選択肢は今でも私が今やっていることです。しかし、私は、フィーチャファイルにいくつかの技術的な単語を入れて、ステップを区別しています:( – robsonrosa

+0

私の編集を参照してください、一般的かもしれませんが、Cucumberが実際のステップをシナリオに接着する方法を提供するまで、 –

関連する問題