从另一个功能中重新规划和重复使用步骤

use*_*391 11 code-reuse specflow

我正在尝试学习specflow,现在.目前我有2个功能文件.

在第二个功能文件中,我将重用第一个功能文件中的一个步骤.

Specflow会自动识别第一个功能文件中的步骤,当specflow为我的第二个功能生成步骤时,它很聪明,并且没有重新生成我重复使用的步骤.

但是这一步是给定步骤,它初始化要素类的成员字段.

在不使用场景上下文的情况下,如何重用初始化类成员的另一个功能文件中的步骤?

编辑

例如,如果您有一个已登录,则在多个功能文件中使用.此"Given"创建一个记录的用户对象,并将其作为成员存储在.cs功能文件中.

当您在另一个.feature中使用相同的Given时,Specflow不会在相应的.cs文件中重新生成它.当您调试正在使用它的场景时,它会从第一个.cs文件执行它.

但我无法访问第一个.cs功能文件的成员.我打算使用静态成员,但也许有另一种解决方案?

非常感谢.

AlS*_*Ski 17

这里的重点是Step Bindings是全球性的.这似乎是许多人经历的Specflow的常见反模式.最初,您有一个阶段,即创建与您的要素文件匹配的绑定类的层次结构.相反,您需要创建与功能不匹配的协作类,而是通过协作生成功能.

它就像你的主要应用程序代码.你不会有一个ATMMachineCashWithdrawal类,而是你有一个ATMMachine,有一个PINCodeCheck,一个OperationSelection和一个WithdrawalOperation.这些对象协作使您"我想提取现金"功能,当您添加"检查我的余额"功能时,您可以重复除了以外的所有内容WithdrawalOperation.

Specflow中的绑定是相同的.我们可能有一个ATMTester知道如何设置ATMMachine和供应您的知识,Given I have a cash machine full of cash并且您可以CustomerTester知道如何假冒/模拟/设置您的帐户余额Given my account has loads of money in it.

幸运的是,SpecFlow也提供了协作类的方法.看看http://www.specflow.org/documentation/Sharing$-between-Bindings/


小智 5

我只是有同样的问题。您需要为派生类设置属性“ Binding”,并为每个类设置范围。

假设您有2个功能:

  • 功能:我的第一个功能
  • 功能:我的第二个功能

    Feature: My First Feature
    Background: 
    Given a precondition
    When ...
    Then ...
    
    Feature: My Second Feature
    Background: 
    Given a precondition
    When ...
    Then ...
    
    Run Code Online (Sandbox Code Playgroud)

并且您有一个BaseClass定义了共享行为

    // no Binding attribute for the BaseClass
    public class BaseClass
    {
        [Given(@"a precondition")]
        public void GivenAPrecondition()
        {
        }
    }
Run Code Online (Sandbox Code Playgroud)

然后是两个类,定义了这两个功能的行为

[Binding]
[Scope(Feature = "My First Feature")]
public class MyFirstFeature : BaseClass
{

}

[Binding]
[Scope(Feature = "My Second Feature")]
public class MySecondFeature : BaseClass
{

}
Run Code Online (Sandbox Code Playgroud)