【问题标题】:What governs when [BeforeScenario] is run in SpecFlow?在 SpecFlow 中运行 [BeforeScenario] 的时间是什么?
【发布时间】:2015-05-12 12:19:04
【问题描述】:

我最近开始了一个使用 SpecFlow 的现有项目。

我在BaseSteps.cs 中添加了一个带有[BeforeScenario] 的方法,它可以进行一些日志记录。 BaseSteps.cs 在其类上没有 [Binding] 属性,但派生类确实有 [Binding]

但是,example.feature 可以使用来自不同DerivedSteps.cs 类的步骤。在这种情况下,[BeforeScenario] 在单个场景中被该功能多次调用。

为什么会这样?什么是单个场景多次调用 BeforeScenario?

【问题讨论】:

    标签: c# specflow


    【解决方案1】:

    一些代码可能有助于识别问题,但可能是派生步骤类都具有方法 [BeforeScenario](因为它们继承了它),因此 specflow 为每个派生类调用一次。

    在 Specflow 中,通常不需要参与任何继承,因为所有步骤都是全局的并且可以从任何地方访问,所以只需将您的 [BeforeScenario] 移动到它自己的类中,在其上添加一个 [Binding] 属性,Specflow 就会找到它使用它。

    【讨论】:

    • so specflow is calling once for each derived class 你知道什么时候吗?我已将属性移动到调用基类上的方法的派生类,因此它们被调用一次。但是,我不确定它是否被前任设置错误,或者 Specflow 是否从它将运行的步骤中收集所有的 BeforeScenarios 并一次执行它们。
    • 我相信它的工作原理是这样的:Specflow 在它知道的所有程序集中(在当前项目和任何外部定义的程序集中)找到所有 BeforeScenarios,然后对于当前场景,它找到与当前匹配的所有 BeforeScenario 方法场景标签并运行它们,没有特定的顺序。就像我说的,最好将你之前的场景放在一个完全独立的类中,specflow 仍然会找到并使用它。
    【解决方案2】:

    避免在 Steps 类中使用继承 - 我发现它有时会导致奇怪的“找到多个匹配的绑定”

    这里的第一个答案解释了为什么继承会导致与 Specflow 步骤混淆: https://stackoverflow.com/a/15508054/2213092

    虽然没有代码,但很难确定它为什么会多次调用特定的 BeforeScenario。如果您仍在对此进行故障排除,您可以在 BeforeScenario 方法上放置一个断点,然后查看调用堆栈以查看它是从哪里触发的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 2021-08-03
      • 1970-01-01
      • 1970-01-01
      • 2021-08-13
      相关资源
      最近更新 更多