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

使用FluentAssertions替代Xunit Assert时出现空引用警告的解决方案咨询

解决FluentAssertions断言异常Message时的NullReference警告

问题根源在于Record.ExceptionAsync返回的是Exception?(可空类型),编译器无法确定捕获到的异常是否非空、是否为目标类型InvalidDataException,直接访问Message会触发空引用警告。以下是仅用FluentAssertions消除警告的两种正确实现方式:

方式一:结合Xunit Record类与FluentAssertions链式断言

先通过FluentAssertions断言捕获的异常类型,利用Which属性获取强类型的非空异常实例,再链式断言Message:

var exception = await Record.ExceptionAsync(() => YourMethodThatThrows());

// 先断言异常类型(隐含非空判断),再链式验证Message
exception.Should().BeOfType<InvalidDataException>()
    .Which.Message.Should().NotBeNull()
    .And.Be("abcs");

BeOfType<InvalidDataException>()会同时验证exception非空且类型匹配,Which返回的是InvalidDataException类型的非空实例,编译器能识别这一点,因此访问Message不会触发警告。

方式二:直接使用FluentAssertions的异常断言扩展方法

完全替换Xunit的Record.ExceptionAsync,改用FluentAssertions原生的ThrowAsync扩展方法,直接在方法调用上完成所有断言:

// 定义待测试的异步操作
Func<Task> testAction = () => YourMethodThatThrows();

// 直接断言操作会抛出指定类型异常,并验证消息
await testAction.Should().ThrowAsync<InvalidDataException>()
    .WithMessage("abcs");

这种方式更符合FluentAssertions的风格,无需手动处理可空异常对象,从根源避免了空引用警告,WithMessage内部已隐含了Message非空的判断。

内容的提问来源于stack exchange,提问作者kiggyttass

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 04:31:03