当 SpecFlow 中 [BeforeScenario] 为 运行 时,由什么决定?

What governs when [BeforeScenario] is run in SpecFlow?

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

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

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

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

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

在 Specflow 中,通常不需要涉及任何继承,因为所有步骤都是全局的并且可以从任何地方访问,所以只需将您的 [BeforeScenario] 移到它自己的 class 中,敲击 [Binding] 上的属性,Specflow 会找到它并使用它。

避免在您的步骤中使用继承 类 - 我发现它有时会导致奇怪 "multiple matching bindings found"

这里的第一个答案解释了为什么继承会导致与 Specflow 步骤混淆:

如果没有代码,则很难确定它为何多次调用特定的 BeforeScenario。如果您仍在解决这个问题,您可以在 BeforeScenario 方法上放置一个断点,然后查看调用堆栈以查看它是从哪里触发的。