【问题标题】:Specflow: Invalid binding: Abstract binding types can have only static binding methodsSpecflow:无效绑定:抽象绑定类型只能具有静态绑定方法
【发布时间】:2014-07-30 18:25:53
【问题描述】:

我们将步骤定义分组到抽象基类中。

但是我注意到以下警告:

无效绑定:抽象绑定类型只能有静态绑定 方法

据我所知,此警告是在 BindingSourceProcessor.cs 中创建的

测试似乎工作正常,这是需要关注的问题吗?这个警告的目的是什么?

【问题讨论】:

  • 略过,但是为您的步骤绑定提供抽象类的目的是什么?这对您有什么好处?
  • 好问题,我们正在使用抽象基类来组织在一组功能中使用的步骤绑定并拉入 ScenarioContext。然后一个给定的特征文件有一个标签,它的具体步骤在一个文件中并继承了通用步骤。绑定类还继承自设置通用 mvc 控制器位和 moq 位的基类。
  • @AlexKay 看到我的回答。使用继承可能有充分的理由,但根据您的描述,最好将 mvc 控制器和 moq 的设置移动到从 [BeforeScenario] 标记方法调用的特定设置类中(cxan 是它自己的,非继承类,仍然会被调用)。通用步骤仍然可以在它们自己的[Binding] 类中,特定步骤可以再次在它们自己的特定步骤类中。即使没有继承,specflow 也会找到所有步骤。
  • 感谢 Sam 关于使用 BeforeScenario 的好点子,我们正在使用 BeforeScenario 和层次结构的每个“层”,每个人都在做相应的设置。你知道它们是否是使用抽象类/继承的后果吗?因为它看起来像是一个相对较新的添加,例如“转到声明”似乎不起作用。
  • 是的,我不确定使用抽象类/继承的后果。如果我是你,我会测试如果我在不同的、非继承的、步骤定义类中有多个 [BeforeScenario] 方法会发生什么。他们都被召唤了吗?如果他们这样做了,那么您也许可以完全取消继承。

标签: specflow


【解决方案1】:

我知道这并不能直接回答您的问题,但我会质疑拥有抽象步骤绑定类的好处。

Specflow step bindings are global(除非您专门do something to make them non global - 但请参阅该页面上的警告)。 Specflow 将扫描所有类以查找具有[Binding] 属性的属性,并将尝试将功能文件中的步骤定义与绑定类中的属性步骤方法进行匹配。

因此,包含步骤定义的抽象类意义不大,因为步骤定义是共享的,无论它们是否通过类继承来继承。

如果您使用抽象类来访问字段,以便您可以在步骤之间共享状态,那么您可以使用 Specflows ScenarioContext 字典,或者更好(恕我直言),使用 context injection feature 来确保将共享上下文注入步骤定义类在步骤之间共享状态,即使这些步骤是在不同的类中定义的。

【讨论】:

  • 谢谢山姆,好建议。我们混合使用了你提到的我想的内容,并使用继承来保持 C# 中的内容井井有条。
  • 在我们的例子中,我们不使用全局步骤绑定,但我们使用标签来限定步骤。如果我们想在两个密切相关的特征文件之间重用一个步骤,那么我们将这个步骤拉到一个共同的祖先中,特别是对于前置条件步骤。我认为应该支持这种场景,基本上Specflow不应该抱怨抽象类只要至少有一个类实现它......
  • @kkara 我不确定您所说的“我们不使用全局步骤绑定”是什么意思。 specflow 中的所有 步骤绑定都是全局的,这就是它的工作方式。恕我直言,将步骤放在一个通用的基类中是不必要的。无论步骤位于哪个文件中,您都可以从两个功能文件中调用您的步骤。您可以使用 ScenarioContext.Current 或通过将您自己的自定义 Context 对象注入每个步骤文件来在不同类中的步骤之间共享状态。
  • 我们专门使用 [Scope(Tag = "FeatureFileTag")] 使它们不是全局的。这个决定背后有多种原因,其中之一是为我们为那些需要将其分开的步骤而编写的每个功能文件保持语言分开。对于确实是全局的步骤,我们使用 ScenarioContext 和全局步骤。
  • @kkara,感谢您的更新。看到其他人使用该框架很有启发性。非常感激。我已更新答案以包含此附加信息
猜你喜欢
  • 1970-01-01
  • 2016-04-02
  • 2017-01-30
  • 2012-12-11
  • 1970-01-01
  • 1970-01-01
  • 2012-10-29
  • 1970-01-01
  • 2015-09-14
相关资源
最近更新 更多