gpt4 book ai didi

javascript - 如何为 cucumber-js 中的每个功能文件指定步骤定义文件?

转载 作者:太空宇宙 更新时间:2023-11-04 16:04:40 25 4
gpt4 key购买 nike

我的目标

我正在尝试为大型应用程序创建可扩展的功能和步骤定义结构,我的第一个镜头是尝试将 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

Cucumber-JVM

我知道在cucumber-jvm中我们可以指定一个链接features和step_definitions的glue属性,这正是我正在寻找的,但是在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 相同的效果?

最佳答案

你不能这样做吗:

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


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

较大代码库中的步骤定义的问题是许多步骤非常相似。即:我导航到“页面” - 您可以将代码放在一个公共(public)位置,并将网址放在其他地方。

就我个人而言,我会这样做:

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

编辑

我找到了一种可以做到这一点的方法。这将是一个通用函数,这不是您的要求的一部分(很抱歉),但我相信这可能是让它工作的唯一方法。

在你的钩子(Hook)上:

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"

关于javascript - 如何为 cucumber-js 中的每个功能文件指定步骤定义文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41978484/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com