You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于NUnit 4.2与.NET 8,如何扩展Assert.That及验证断言成功?

在NUnit 4.2 + .NET 8中扩展断言以记录成功状态

场景背景

你在使用NUnit 4.2和.NET 8时,需要在单个测试方法的大量断言中,不仅在失败时输出自定义信息,还要在成功时记录日志,以便CI流水线追踪每个断言的执行情况,且无法将断言拆分为多个测试方法。


问题1:如何为Assert.That扩展新参数?

NUnit的Assert是静态类,无法直接扩展其现有方法的参数,但可以通过封装自定义断言类来实现需求,添加自定义的成功描述参数,并在内部调用原生NUnit断言逻辑。

自定义断言类示例

using NUnit.Framework;
using NUnit.Framework.Constraints;

public static class CustomAssert
{
    // 重载适配常用的断言场景
    public static void That<T>(T actual, IResolveConstraint constraint, string failureMessage = null, string successDescription = null)
    {
        // 先记录当前已有的失败断言数
        int initialFailedCount = TestContext.CurrentContext.AssertionResults.Count(result => !result.IsSuccess);
        
        // 执行原生NUnit断言
        Assert.That(actual, constraint, failureMessage);
        
        // 判断断言是否成功(失败数未增加则表示成功)
        int currentFailedCount = TestContext.CurrentContext.AssertionResults.Count(result => !result.IsSuccess);
        if (initialFailedCount == currentFailedCount && !string.IsNullOrEmpty(successDescription))
        {
            TestContext.Out.WriteLine($"✅ Assertion passed: {successDescription}");
        }
    }

    // 可根据需要添加更多重载(比如无failureMessage的版本)
    public static void That<T>(T actual, IResolveConstraint constraint, string successDescription)
    {
        That(actual, constraint, null, successDescription);
    }
}

使用方式

在测试方法中替换原生Assert.That为自定义的CustomAssert.That,传入成功描述参数:

[Test]
public void Add_Two_Numbers()
{
    int a = 2, b = 3, c = 4, d = 5;

    int resultAB = a + b;
    int resultCD = c + d;

    Assert.Multiple(() =>
    {
        CustomAssert.That(resultAB, Is.EqualTo(5), 
            failureMessage: "Somehow it's not 5", 
            successDescription: $"Checking if {a}+{b} equals 5");
        CustomAssert.That(resultCD, Is.EqualTo(9), 
            failureMessage: "Somehow it's not 9", 
            successDescription: $"Checking if {c}+{d} equals 9");
    });
}

问题2:如何验证断言是否成功(特别是在Assert.Multiple作用域内)?

Assert.Multiple会捕获所有断言异常,不会立即终止执行,因此无法通过常规的try/catch判断断言是否成功。解决方案是利用NUnit提供的TestContext.CurrentContext.AssertionResults集合,通过对比断言执行前后的失败断言数量来判断当前断言的状态:

  1. 执行断言前,统计集合中失败断言的数量;
  2. 执行原生断言后,再次统计失败断言数量;
  3. 如果两次数量相等,说明当前断言执行成功;如果数量增加,则断言失败。

这种方式既适配普通断言场景,也完全兼容Assert.Multiple的批量断言逻辑,能准确追踪每个断言的执行结果。


内容的提问来源于stack exchange,提问作者col-A

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 23:32:06