使用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
相关产品推荐
相关产品推荐

