用于specflow的动态步骤定义匹配

时间:2016-11-12 21:00:42

标签: specflow

步骤匹配可以通过Scope确定: https://github.com/techtalk/SpecFlow/wiki/Scoped-bindings。 但这是静态机制。 有没有办法让这个机制动态化:

  1. 在单一场景中,我有两个或更多相同的步骤
  2. 此步骤有许多步骤定义,用(属性?)
  3. 修饰
  4. 我有步骤更改上下文并基于此步骤中的键集将调用不同的方法
  5. 这就像范围机制+动态性的标签限制。

    我在不同的页面上测试多个表的应用程序。我必须验证是否:

    • 表包含行(是子集)
    • 表具有确切的行(项目和顺序)(相等)
    • 表有行(但顺序并不重要)。

    我在写:

    When I am on Page1
    Then I expect that table contains
    | Column1Name | Column2Name | Column3Name |
    | row1id             | true                 | address          |
    | row2id             | true                 | address          |
    When I do some change action on rows
    | Column1Name |
    | row1id             |
    Then I expect that table contains
    | Column1Name | Column2Name |
    | row1id             | false                |
    | row2id             | true                 |
    

    我只有一个步骤定义“我希望该表包含”。 它验证步骤中提供的单元格。 此步骤用于不同页面和页面的不同页面。 这些页面显示了不同的业务对象,具有不同的列,但ui很常见。 如果没有这个,我将不得不为每个页面和每个列组合编写步骤。

    但是,在“我希望该表包含”之前,应该采取一些特定的操作。 例如:

    • 在不同页面上使用的不同搜索过滤器。
    • 在ui(服务,缓存等)上显示操作更改之前所需的超时

    我不想明确地写它,因为它会使该场景因不必要的信息而过载。

1 个答案:

答案 0 :(得分:0)

正如Sam Holder所写,这是不可能的,但我通过向Step类注入行为来实现它。 我使用SpecFlow.Autofac.SpecFlowPlugin将Behaviors注册为命名服务 https://github.com/gasparnagy/SpecFlow.Autofac 这是示例代码。实现要复杂得多。这只是草案。

有改变上下文密钥的步骤。与行为类相同。

    public interface ITableBehavior
    {
        void Search(Table table);
    }

    [ContextKey("Page1")]
    public class Page1Behavior : ITableBehavior
    {
        public void Search(Table table)
        {
            throw new System.NotImplementedException();
        }
    }

    [ContextKey("Page2")]
    public class Page2Behavior : ITableBehavior
    {
        public void Search(Table table)
        {
            throw new System.NotImplementedException();
        }
    }

    [Binding]
    public class Step
    {
        private ITableBehavior TableBehavior { get { return BehaviorResolver.Resolve<ITableBehavior>(); } }

        [Then("I expcet that table contains")]
        public void TableContains(Table table)
        {
                TableBehavior.Search(table);
                //table contains implementation
        }
    }