如何连接小黄瓜步骤定义中的所有断言失败?

问题描述 投票:0回答:1

当我的小黄瓜场景中的任何步骤失败时,我想运行一些自定义报告逻辑。我们使用 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 是否有更好的选择或功能?

c# cucumber gherkin fluent-assertions
1个回答
0
投票

我的调查继续进行,我发现了

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");
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.