2017-02-01 5 views
0

Mein Ziel

Ich versuche, eine skalierbare Struktur von Features und Schritt Definitionen für eine große Anwendung und mein erster Schuss versucht step_definition Dateien Features erstellen zu verknüpfen, so dass ich das gleiche Schrittmuster für verschiedene Schrittdefinitionen verwenden könnte .Wie kann ich die Schrittdefinitionsdatei für jede Feature-Datei in gurke-js angeben?

My-Code

zeige ich mein aktuelles Beispiel:

Meine Ordnerstruktur:

/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 

In meinem sample.feature ich habe:

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" 

In meinem example.feature ich habe:

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" 

Die Given und When Schritte sind bei /common/common_steps.js Datei definiert und funktioniert gut.

Der Then Schritt ist sowohl auf sample_steps.js als auch auf example_steps.js aber anders definiert.

In meinem sample_steps.js ich habe:

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

Und schließlich in meinem example_steps.js ich habe:

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

Der Fehler

Mein Hauptziel zu haben ist alles grün hier, aber natürlich funktioniert es nicht und ich bekomme diesen offensichtlichen Fehler:

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 

Cucumber-JVM

Ich weiß, dass in Gurken-jvm wir ein glue Attribut angeben, die Funktionen und step_definitions verbindet und es ist genau das, was ich suche, aber in Gurken-js. Beispiel in 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{ 
} 

Schließlich

Wie kann ich die gleiche wie cucumbr-jvm mit Gurken-js erreichen?

Antwort

1

Kannst du nicht dies nur tun:

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


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

Die Sache mit Schritt Definitionen in einer größeren Code-Basis ist, dass viele Schritte sehr ähnlich sind. Ich navigiere zu "page" - Sie können den Code an einem gewöhnlichen Ort platzieren und die URLs woanders haben.

Persönlich würde ich dies tun:

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 
}); 

Aber dies recht lange erhalten könnte. Wenn sie völlig verschiedene Dinge tun, gehen Sie mit der ersten Option, wenn sie so ziemlich das gleiche tun, verwenden Sie die zweite Option.

Es kann tatsächlich sein, dass Sie nur das tun müssen, um:

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

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

// CARRY ON WITH COMMON STUFF 
}); 

EDIT

ich einen Weg gefunden haben, die es tun könnte. Es wäre eine generische Funktion, die nicht Teil Ihrer Anforderungen ist (tut mir leid), aber ich glaube, dass dies der einzige Weg ist, um es zum Laufen zu bringen.

In Ihrem Haken:

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(); 
}); 

In Ihrer Schrittdefinition:

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

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

Während es Ihren Schritt Definition generischer verläßt, bedeutet das, Sie etwas in die doppelten Anführungszeichen setzen, und so lange Wenn Sie Ihr Szenario markieren, wird der richtige Code ausgeführt.

+0

gut ... Ich möchte eine super generische Methode vermeiden, die Argumente erhält, weil es den Schritt zu komplex macht. Ihre erste Option ist immer noch, was ich gerade mache. Aber es bringt mich einige technische Wörter in die Feature-Datei, um Schritte zu unterscheiden ... :( – robsonrosa

+0

Siehe meine Bearbeitung, es kann allgemein sein, aber würde tun, was Sie wollen, bis Gurke eine Möglichkeit gibt, den tatsächlichen Schritt zu einem Szenario zu kleben. –

Verwandte Themen