为何NUnit的Has.Exactly(n).Items断言抛出ArgumentException错误?
问题原因分析与解决方案
首先得明确报错的核心原因:你用到的Has.Exactly(5).Items约束是NUnit专门用来统计集合(实现了IEnumerable接口的类型,比如List、数组、IEnumerable<T>等)里的元素数量的,但你的model是OnlineSignupModel的单个实例对象,并不是集合类型,所以NUnit会抛出ArgumentException,提示你传入的actual参数必须是IEnumerable类型。
接下来分两种常见需求给你对应的解决办法:
如果你想验证对象的属性总数是5个
如果你的目的是确认OnlineSignupModel类刚好有5个可访问的公共属性,那得借助反射来获取属性数量,再做断言:
[Test] public void CreateNewTemplateTest() { OnlineSignupModel model = new OnlineSignupModel { SalesRepId = 68, PriceAdvanced = 22.33m, PriceComplete = 44.33m, PriceMvr = 6.33m, SetupFee = 2.33m }; // 获取类的公共属性数量 var propertyCount = typeof(OnlineSignupModel).GetProperties().Length; Assert.That(propertyCount, Is.EqualTo(5)); }
如果你想验证设置的5个属性值都符合预期
如果你的真实需求是确认刚才初始化的5个属性值都正确,那推荐用Assert.Multiple来批量验证(这样即使多个断言失败,也能一次性看到所有失败项):
[Test] public void CreateNewTemplateTest() { OnlineSignupModel model = new OnlineSignupModel { SalesRepId = 68, PriceAdvanced = 22.33m, PriceComplete = 44.33m, PriceMvr = 6.33m, SetupFee = 2.33m }; Assert.Multiple(() => { Assert.That(model.SalesRepId, Is.EqualTo(68)); Assert.That(model.PriceAdvanced, Is.EqualTo(22.33m)); Assert.That(model.PriceComplete, Is.EqualTo(44.33m)); Assert.That(model.PriceMvr, Is.EqualTo(6.33m)); Assert.That(model.SetupFee, Is.EqualTo(2.33m)); }); }
你也可以用链式的Has.Property约束来简化写法:
Assert.That(model, Has.Property("SalesRepId").EqualTo(68) .And.Property("PriceAdvanced").EqualTo(22.33m) .And.Property("PriceComplete").EqualTo(44.33m) .And.Property("PriceMvr").EqualTo(6.33m) .And.Property("SetupFee").EqualTo(2.33m));
最后再提个醒:Has.Exactly(n).Items只对集合类型生效,单个对象可别用这个约束哦~
内容的提问来源于stack exchange,提问作者Dean Friedland
相关产品推荐
相关产品推荐

