如何在cucumber-js中为每个要素文件指定步骤定义文件?

时间:2017-02-01 11:19:15

标签: javascript bdd cucumberjs

我的目标

我正在尝试为大型应用程序创建可扩展的功能和步骤定义结构,我的第一个尝试是尝试将step_definition文件链接到功能,以便我可以对不同的步骤定义使用相同的步骤模式。

我的代码

我展示了我当前的例子:

我的文件夹结构:

/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"

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

错误

我的主要目标是在这里拥有所有绿色,但当然,它不起作用,我得到了这个显而易见的错误:

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

我知道在cucumber-jvm中我们可以指定一个glue属性来链接feature和step_definitions,它正是我正在寻找的,但是在cucumber-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{
}

最后

如何使用cucumber-js实现与cucumbr-jvm相同的效果?

1 个答案:

答案 0 :(得分: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
});

但这可能会持续很长时间。如果他们完全不同的话,请选择第一个选项,如果他们做同样的事情,请使用第二个选项。

实际上,你可能只需要这样做:

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

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

 // CARRY ON WITH COMMON STUFF
});

修改

我找到了一种方法可以做到这一点。这将是一个通用的功能,这不是你的要求的一部分(对不起),但我相信这可能是让它发挥作用的唯一方法。

在你的钩子里:

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"