如何掌握NUnit Constraint Model?寻求约束选择思路指导
NUnit约束模型选择指南(Is./Has./Does. 适用场景梳理)
核心约束分类与定位
先明确三个核心前缀的职责边界,从根本上避免混用:
- Is.:聚焦被测试对象的自身状态、属性值或类型判断,是最基础的对象级验证
- Has.:聚焦被测试对象的成员(属性/字段)、集合元素或包含关系验证,用于深入对象内部结构的判断
- Does.:聚焦被测试对象的**行为(方法调用、委托执行)**结果验证,专门处理需要执行代码才能判断的场景
Is. 系列约束适用场景
- 值匹配验证
Is.EqualTo(expected):验证对象值相等(值类型或重写Equals的引用类型),例:Assert.That(user.Age, Is.EqualTo(25));Is.Not.EqualTo(expected):反向值匹配
- 空值/空集合验证
Is.Null/Is.Not.Null:判断引用类型是否为空Is.Empty/Is.Not.Empty:判断字符串、数组、集合是否为空
- 类型验证
Is.TypeOf<T>():严格匹配对象的精确类型Is.InstanceOf<T>():验证对象是T或其子类的实例
- 集合批量验证
Is.All.EqualTo(value):验证集合中所有元素都满足某约束Is.Any.EqualTo(value):验证集合中至少一个元素满足某约束
Has. 系列约束适用场景
- 成员存在与值验证
Has.Property("PropertyName"):验证对象存在指定名称的属性Has.Property("PropertyName").EqualTo(expected):同时验证属性的取值,例:Assert.That(user, Has.Property("Name").EqualTo("Alice"));
- 包含关系验证
Has.Member(item):验证集合/数组包含指定元素Has.Substring("subStr"):验证字符串包含指定子串
- 字典键值验证
Has.Key(key):验证字典包含指定键Has.Key(key).WithValue(value):同时验证键对应的取值
Does. 系列约束适用场景
- 异常验证
Does.Throw<ExceptionType>():验证方法调用会抛出指定类型的异常,必须用委托包裹方法调用,否则会直接执行方法导致崩溃,例:Assert.That(() => userService.DeleteInvalidUser(-1), Does.Throw<ArgumentException>());Does.Not.Throw():验证方法执行无异常
- 委托返回值验证
Does.Return(expected):验证委托执行后的返回值,例:Assert.That(() => calculator.Add(2,3), Does.Return(5));
避免执行崩溃的关键注意点
- 约束上下文错误:使用
Does.系列时,必须传入委托(() => 方法调用),不能直接执行方法,否则方法会在断言前执行,触发异常导致崩溃 - 类型不匹配:用
Is.EqualTo比较未重写Equals的引用类型时,默认比较引用地址,若预期值匹配,需改用Has.Property验证成员,或确保类型重写了Equals - 成员名称错误:
Has.Property("WrongName")编译通过,但执行时会抛出找不到属性的异常,需严格匹配成员名称
约束选择思维导图(文字版)
NUnit约束模型 ├─ Is.(对象自身状态) │ ├─ 值判断:EqualTo/Not.EqualTo │ ├─ 空值:Null/Not.Null / Empty/Not.Empty │ ├─ 类型:TypeOf/InstanceOf │ └─ 集合批量:All/Any ├─ Has.(对象成员/包含关系) │ ├─ 属性/字段:Property/Field + 子约束 │ ├─ 集合元素:Member │ ├─ 字符串:Substring │ └─ 字典:Key/Key.WithValue └─ Does.(对象行为) ├─ 异常:Throw/Not.Throw └─ 委托返回:Return
内容的提问来源于stack exchange,提问作者Joe Markov
相关产品推荐
相关产品推荐

