我们使用 Specflow,目前,我们的大部分断言都是使用 Fluent Assertions 完成的,即看起来像:
myval.Should().NotBe(null)
一切正常,但在某些情况下,我们希望相同的代码有时断言不确定,有时则不然。
例如,假设我们有一个调用方法来安装 AUT 的步骤。
断言 AUT 可以正确安装的测试将使用此方法作为 WHEN/THEN 步骤的一部分。
在这种情况下,如果安装失败,我们希望照常进行并使测试失败。
鉴于 AUT 未安装
当我安装 AUT
但是,对于所有其他测试,相同的方法 可以作为 GIVEN 步骤的一部分或作为 BeforeScenario/BeforeFeature Hook 的一部分调用,在这种情况下,如果安装失败,测试应该因不确定而失败,因为失败的不是测试本身,而是设置阶段。
鉴于已安装 AUT
当我执行 AUT 的功能 X 时
所以在这个例子中,让我们假设在第一个测试中 WHEN I install the AUT
的步骤定义,以及在第二个测试中 GIVEN the AUT is installed
只需使用类似 AppFacade.Install()
当然我们可以乱用 AppFacade.Install()
和我们所有其他带有条件的辅助方法等,但我想知道是否有人有更优雅的解决方案 - 即扩展断言的方法引擎,以便它自动应用此逻辑 - 我认为在 Specflow 方面没有任何障碍可以实现这一点,因为您可以检查 Specflow 上下文对象以检测您正在进行的步骤类型。
理想情况下,我们希望坚持使用 Fluent Assertions,但如果这使事情过于复杂,我们愿意重新考虑。
最佳答案
我的意思是你问的问题不对,因为你是在暗示当 Specflow
步骤执行失败时,测试应该是不确定的,但你已经意识到了。
所以回答你的实际问题:
Is it possible to throw an exception which can mark the test as inconclusive given the above logic?
是的,您可以使用 AfterStep
钩子(Hook)(参见 Specflow
钩子(Hook) here )来检查是否有任何异常抛出并执行 Assert.Inconclusive()
如果您正在使用 Nunit
或任何等效方法,例如 Specflow
的 ScenarioContext.Current.Pending()
不附加到安装的测试框架,唯一需要注意的是 ScenarioContext.Current.Pending()
不清除 ScenarioContext.TestStatus
,因此您的测试运行器将标记它为红色,您必须使用反射来设置 TestStatus
属性,如 here 所述.
它看起来像这样:
[AfterStep]
public void Check()
{
if (ScenarioContext.Current.TestError is AssertionException &&
ScenarioContext.Current.CurrentScenarioBlock == ScenarioBlock.Given)
Assert.Inconclusive(ScenarioContext.Current.TestError.Message);
}
编辑
Here是我创建的演示。
关于c# - Specflow 上下文断言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43101426/