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

