我正在尝试为大型应用程序创建可扩展的功能和步骤定义结构,我的第一个尝试是尝试将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"
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
我知道在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相同的效果?
答案 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"