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

