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

使用NUnit Assert时如何合并多个嵌套子属性的断言条件?

合并NUnit中嵌套对象的断言

我需要断言结果数组里的CourseInstanceSummary对象满足所有指定规则,该对象包含Room和Site两个嵌套对象,但之前只能写两个独立的NUnit断言分别验证这两个嵌套对象的字段,现在想把它们合并成一个断言。

原有代码

Assert.That(sut.FutureInstances, Has.Exactly(1).InstanceOf<CourseInstanceSummary>().With
    .Property(nameof(CourseInstanceSummary.Id)).EqualTo(courseInstance.Id).And
    .Property(nameof(CourseInstanceSummary.StartDate)).EqualTo(courseInstance.StartDate).And
    .Property(nameof(CourseInstanceSummary.TrainingMode)).EqualTo(courseInstance.TrainingMode).And
    .Property(nameof(CourseInstanceSummary.TotalSeats)).EqualTo(courseInstance.TotalSeats).And
    .Property(nameof(CourseInstanceSummary.Participants)).EqualTo(courseInstance.Participants).And
    .Property(nameof(CourseInstanceSummary.Room)).With
        .Property(nameof(CourseInstanceSummary.RoomSummary.Id)).EqualTo(courseInstance.Room!.Id).And
        .Property(nameof(CourseInstanceSummary.RoomSummary.Name)).EqualTo(courseInstance.Room!.Name)
);

Assert.That(sut.FutureInstances, Has.Exactly(1).InstanceOf<CourseInstanceSummary>().With
    .Property(nameof(CourseInstanceSummary.Id)).EqualTo(courseInstance.Id).And
    .Property(nameof(CourseInstanceSummary.StartDate)).EqualTo(courseInstance.StartDate).And
    .Property(nameof(CourseInstanceSummary.TrainingMode)).EqualTo(courseInstance.TrainingMode).And
    .Property(nameof(CourseInstanceSummary.TotalSeats)).EqualTo(courseInstance.TotalSeats).And
    .Property(nameof(CourseInstanceSummary.Participants)).EqualTo(courseInstance.Participants).And
    .Property(nameof(CourseInstanceSummary.Site)).With
        .Property(nameof(CourseInstanceSummary.SiteItem.Id)).EqualTo(courseInstance.Site!.Id).And
        .Property(nameof(CourseInstanceSummary.SiteItem.Name)).EqualTo(courseInstance.Site!.Name)
);

合并后的代码

利用NUnit约束的链式And语法,将Room和Site的验证逻辑合并到同一个断言中,一次性验证所有属性:

Assert.That(sut.FutureInstances, Has.Exactly(1).InstanceOf<CourseInstanceSummary>().With
    .Property(nameof(CourseInstanceSummary.Id)).EqualTo(courseInstance.Id).And
    .Property(nameof(CourseInstanceSummary.StartDate)).EqualTo(courseInstance.StartDate).And
    .Property(nameof(CourseInstanceSummary.TrainingMode)).EqualTo(courseInstance.TrainingMode).And
    .Property(nameof(CourseInstanceSummary.TotalSeats)).EqualTo(courseInstance.TotalSeats).And
    .Property(nameof(CourseInstanceSummary.Participants)).EqualTo(courseInstance.Participants).And
    // 验证Room嵌套对象
    .Property(nameof(CourseInstanceSummary.Room)).With
        .Property(nameof(CourseInstanceSummary.RoomSummary.Id)).EqualTo(courseInstance.Room!.Id).And
        .Property(nameof(CourseInstanceSummary.RoomSummary.Name)).EqualTo(courseInstance.Room!.Name).And
    // 用And连接,继续验证Site嵌套对象
    .Property(nameof(CourseInstanceSummary.Site)).With
        .Property(nameof(CourseInstanceSummary.SiteItem.Id)).EqualTo(courseInstance.Site!.Id).And
        .Property(nameof(CourseInstanceSummary.SiteItem.Name)).EqualTo(courseInstance.Site!.Name)
);

说明

NUnit的约束系统支持通过.And链式组合多个属性验证规则,不管是顶层属性还是嵌套对象的属性,都可以依次串联在同一个断言中,这样就能避免重复编写相同的顶层属性验证逻辑,同时一次性完成所有规则的校验。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 09:02:27