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

xUnit测试出现System.NullReferenceException问题求助

解决xUnit中的NullReferenceException问题

嘿,我一眼就发现你遇到的System.NullReferenceException的根源啦!问题出在你的初始化方法上:

问题原因

你给Setup方法标记了[Fact]属性,但在xUnit里,[Fact]是用来标记可执行的测试用例的,不是初始化方法。这就导致你的calculateDiscount = new CalculateDiscount();代码根本不会在测试方法运行前自动执行,calculateDiscount始终是null,当你在测试逻辑里调用它的时候,自然就抛出空引用异常了。

修复方案

xUnit没有像NUnit那样的[SetUp]属性,推荐用两种方式来做初始化:

方式1:使用构造函数(推荐新手)

xUnit会在每个测试方法执行前,自动创建测试类的实例,所以把初始化逻辑放到构造函数里,就能保证每次测试都能拿到一个新鲜的CalculateDiscount实例:

public class UnitTest1 {
 private CalculateDiscount calculateDiscount;

 // 构造函数初始化
 public UnitTest1() {
 calculateDiscount = new CalculateDiscount();
 }

 [Theory]
 [InlineData(10.00, "Summer", 100.00)]
 public void WhenRuleName_Is_Summer_Return_Valid(decimal amount, string ruleName, decimal expectedDiscount) {
 // 现在可以安全使用calculateDiscount了,比如调用它的方法
 var actualDiscount = calculateDiscount.Calculate(amount, ruleName); // 替换成你实际的方法名
 Assert.Equal(expectedDiscount, actualDiscount);
 }
}

方式2:使用IClassFixture(适合共享实例场景)

如果希望多个测试共享同一个CalculateDiscount实例,可以实现IClassFixture接口:

public class UnitTest1 : IClassFixture<CalculateDiscount> {
 private CalculateDiscount calculateDiscount;

 public UnitTest1(CalculateDiscount fixture) {
 calculateDiscount = fixture;
 }

 [Theory]
 [InlineData(10.00, "Summer", 100.00)]
 public void WhenRuleName_Is_Summer_Return_Valid(decimal amount, string ruleName, decimal expectedDiscount) {
 // 逻辑同上
 var actualDiscount = calculateDiscount.Calculate(amount, ruleName);
 Assert.Equal(expectedDiscount, actualDiscount);
 }
}

小提示

别把xUnit和其他测试框架(比如NUnit、MSTest)的注解搞混啦,xUnit的设计更简洁,用构造函数来做初始化是最直观的方式哦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:14:34