当我的小黄瓜场景中的任何步骤失败时,我想运行一些自定义报告逻辑。我们使用 FluentAssertions 在 Gherkin 步骤中运行实际测试,我想我也许能够以某种方式连接到断言失败来运行我自己的代码。
GitHub Copilot 为我想出了这个宝石:
using FluentAssertions;
using FluentAssertions.Execution;
[Binding]
public class CommonStepsDefinitions
{
// ...
[BeforeScenario]
public void BeforeScenario()
{
AssertionOptions.AssertionFailed += OnAssertionFailed;
}
[AfterScenario]
public void AfterScenario()
{
AssertionOptions.AssertionFailed -= OnAssertionFailed;
}
private void OnAssertionFailed(AssertionFailedException exception)
{
// Custom logic here. For example, you could log the exception:
_logger.LogError(exception, "An assertion failed.");
}
// ...
}
但这似乎是幻觉,因为我无法从 FluentAssertions 中找到任何涵盖该内容的文档,并且代码直接无法编译。
当我向 copilot 寻求更好的解释时,它建议我创建自己的包装器来捕获从 FluentAssertion 语句抛出的异常:
public void AssertWithLogging(Action assert)
{
try
{
assert();
}
catch (Exception ex)
{
_logger.LogError(ex, "An assertion failed.");
throw;
}
}
// ...
AssertWithLogging(() => assertion.Should().BeTrue());
这是迄今为止我得到的最好的选择,但我的问题是,当我们开发新步骤时,很容易忘记包装未来的断言。
我缺少的 FluentAssertions 或 Gherkin/Cucumber 是否有更好的选择或功能?
我的调查继续进行,我发现了
AfterStep
属性,允许我在每个步骤后检查失败状态。
在
AfterStep
处理程序内,我们可以使用静态 ScenarioStepContext.Current
访问当前(失败)步骤的上下文,并允许我们根据步骤信息触发报告逻辑。
[AfterStep]
public void AfterStep()
{
if (ScenarioStepContext.Current.Status == ScenarioExecutionStatus.TestError)
{
//the step threw an exception
_logger.LogError(ScenarioStepContext.Current.TestError, "a step failed");
}
}