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

为何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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:49:15