【问题标题】:Dynamic step definition matching for specflowspecflow 的动态步骤定义匹配
【发布时间】:2017-03-26 20:13:03
【问题描述】:

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

  1. 在单一场景中,我有两个或更多相同的步骤
  2. 这个步骤有很多步骤定义用(属性?)装饰
  3. 我有步骤更改上下文并基于此步骤中设置的键,将调用不同的方法

这就像来自 Scope 机制的 Tag 限制 + 动态性。

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

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

我在写:

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(服务、缓存等)上出现操作更改之前所需的超时时间

我不想显式地写它,因为它使那个场景充满了不必要的信息。

【问题讨论】:

  • 这是不可能的,而且听起来可能令人困惑。为什么你认为你想要这个?你的用例是什么?可能有比您试图找到的更好的解决方案
  • 感谢您的回答。我同意你的观点,这可能会令人困惑。我编辑了我的问题并添加了示例场景草案和概念。在我的案例中,我想避免写入许多相同/相似的步骤定义。

标签: specflow


【解决方案1】:

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

有一个步骤可以更改上下文键。与上面提供的 Behavior 类相同。

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

【讨论】:

    猜你喜欢
    • 2018-06-20
    • 2014-09-26
    • 1970-01-01
    • 2011-07-16
    • 1970-01-01
    • 1970-01-01
    • 2011-07-10
    • 1970-01-01
    相关资源
    最近更新 更多