2017-02-01 4 views
0

Моей цель

Я пытаюсь создать масштабируемую структуру функций и определений шага для большого приложения и мой первый выстрел пытается связать step_definition файлы к функциям, так что я мог бы использовать один и тот же шаблон шага для различных определений шага ,Как указать файл определения шага для каждого файла функции в cucumber-js?

Мой код

Я показываю мой текущий пример:

Моя структура папок:

/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 

В моей sample.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" 

В моей 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 "example" 

Шаги Given и When определены в файле /common/common_steps.js и отлично работают.

Шаг Then определяется как sample_steps.js, так и example_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; 
}); 

Ошибка

Моя главная цель состоит в том, чтобы иметь все зеленые здесь, но, конечно, это не сработает, и я получаю эту обходную ошибку:

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 мы можем указать атрибут glue, который связывает функцию и step_definitions, и это именно то, что я ищу, но в огурце-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{ 
} 

Наконец

Как я могу достичь того же, как cucumbr-JVM с помощью огурца-JS?

ответ

1

Разве вы не можете просто сделать это:

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


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

Вещь с шагом определения в большей кодовую является то, что многие шаги очень похожи. i.e: Я перехожу к «странице» - вы можете поместить код в обычное место и иметь 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 
}); 

Но это может быть довольно долго. Если они делают совершенно разные вещи, пойдите с первым вариантом, если они делают почти то же самое, используйте второй.

Это может быть на самом деле, что вам нужно только сделать это:

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

См. Мое редактирование, оно может быть общим, но будет делать то, что вы хотите, пока Огурец не даст склеить фактический шаг к сценарию. –

Смежные вопросы