我有两个功能文件和一些相同的场景。当我为它们创建定义时,第一个feature1.cs文件包含所有步骤。当我点击第二个特征文件并生成定义时,它会重用第一个feature1.cs文件中的一些函数,因为某些场景是重复的。
现在我对这两个文件都有一个[BeforeScenario]
。但是当我运行第二个功能文件时,它最终会使用第一个文件的[BeforeScenario]
。
我注意到feature1.cs文件中的Binding标签有我的两个特征文件的名称,如
[Binding, Scope(Feature = "feature1"), Scope(Feature="feature2")]
所以我删除了第二个feature2并将其放在我的feature2.cs文件中。
现在,我可以从feature2.cs运行[BeforeFeature]
,但是当我点击方案步骤并进行定义时,它会显示"找到多个步骤"尽管feature1.cs文件本身存在所有可重用的步骤。
我希望这是有道理的。
答案 0 :(得分:1)
您需要意识到的第一件事是specflow中的所有步骤定义都是全局的。为了说明这一点,假设我有3个文件:Feature1.feature,Feature2.feature和myStepDefs.cs。
在myStepDefs.cs中,我有以下代码:
[Given(@"I have asked a new question")]
public void GivenIHaveAskedANewQuestion{
//Some Code
}
现在在我的feature1文件中,我有这个场景
Scenario: I ask a question and get a bad answer
Given I have asked a new question
When I get an answer
And this answer is not helpful
Then I should Downvote this answer
And I should explain why it does not help answer my question
在我的feature2文件中,我有这个场景
Scenario: I ask a question and get a good answer
Given I have asked a new question
When I get an answer
And this answer is helpful
Then I should upvote this answer
And I should mark this answer as accepted
在这种情况下,我们重复使用给定的步骤,但我们只需要一步定义,而不是每个功能一个。
现在您还解释说您有2个[BeforeScenario]
StepDefs。这些在每个场景之前运行,所以如果他们做同样的事情,你再次只需要一个。如果他们做了不同的事情并且你只希望它们在给定的功能/场景之前运行,那么我建议你看一下this,你需要做的就是为这些绑定分配范围,使它看起来像这样:
[BeforeScenario, Scope(//your scope)]
这样,BeforeScenario步骤仅针对其给定范围运行