在Fluent Validation中如何识别多验证规则属性的具体失败验证器
在Fluent Validation中如何识别多验证规则属性的具体失败验证器
嘿,我懂你现在的痛点——当一个属性上绑了好几条Fluent Validation规则时,测试里只能知道这个属性验证失败了,但没法精准揪出到底是哪条规则触发的错误。别慌,这里有几个实用的小技巧帮你搞定这个问题:
方法一:给每条规则添加自定义错误消息
最直接的方式就是给不同的验证规则设置独一无二的错误消息,这样在测试里就能通过匹配消息内容来判断是哪条规则出了问题。
修改你的验证器代码:
RuleFor(c => c.MinSize) .GreaterThanOrEqualTo(limits.MinLimit) .WithMessage("MinSize不能小于系统最小限制值{0}", limits.MinLimit) .LessThan(c => c.PreferredSize ?? limits.PreferredLimit) .WithMessage("MinSize不能大于PreferredSize(或默认首选限制值{0})", limits.PreferredLimit);
然后在测试里针对性检查错误消息:
[Test] public void Fail_when_min_below_min_limit() { var resource = new QualityDefinitionResource { MinSize = -1 }; var limits = new QualityDefinitionLimits(); var sut = new QualityDefinitionResourceValidator(limits); var result = sut.TestValidate(resource); // 验证是“小于最小限制”这条规则触发的错误 result.ShouldHaveValidationErrorFor(c => c.MinSize) .WithErrorMessage("MinSize不能小于系统最小限制值0"); // 替换为你的limits.MinLimit实际值 } [Test] public void Fail_when_min_above_preferred_size() { var resource = new QualityDefinitionResource { MinSize = 10, PreferredSize = 8, MaxSize = 100 }; var limits = new QualityDefinitionLimits(); var sut = new QualityDefinitionResourceValidator(limits); var result = sut.TestValidate(resource); // 验证是“大于PreferredSize”这条规则触发的错误 result.ShouldHaveValidationErrorFor(c => c.MinSize) .WithErrorMessage("MinSize不能大于PreferredSize(或默认首选限制值{0})", limits.PreferredLimit); }
方法二:使用自定义错误代码(更推荐)
如果担心错误消息会因为本地化、文案调整而导致测试失败,那用自定义错误代码是更稳定的方案。每条规则绑定一个唯一的错误代码,测试时只需要检查这个代码即可。
修改验证器代码:
RuleFor(c => c.MinSize) .GreaterThanOrEqualTo(limits.MinLimit) .WithErrorCode("MinSize_BelowMinLimit") .LessThan(c => c.PreferredSize ?? limits.PreferredLimit) .WithErrorCode("MinSize_AbovePreferredSize");
测试里检查错误代码:
[Test] public void Fail_when_min_below_min_limit() { // ... 其他测试代码不变 result.ShouldHaveValidationErrorFor(c => c.MinSize) .WithErrorCode("MinSize_BelowMinLimit"); } [Test] public void Fail_when_min_above_preferred_size() { // ... 其他测试代码不变 result.ShouldHaveValidationErrorFor(c => c.MinSize) .WithErrorCode("MinSize_AbovePreferredSize"); }
方法三:利用规则集(RuleSets)拆分验证逻辑
你还可以把不同的验证规则分到不同的规则集里,测试时指定只验证某个规则集,这样就能精准测试单条规则的逻辑。
修改验证器代码:
// 把“大于等于最小限制”的规则分到MinLimit规则集 RuleFor(c => c.MinSize) .GreaterThanOrEqualTo(limits.MinLimit) .RuleSet("MinLimitValidation", () => {}); // 把“小于PreferredSize”的规则分到PreferredSize规则集 RuleFor(c => c.MinSize) .LessThan(c => c.PreferredSize ?? limits.PreferredLimit) .RuleSet("PreferredSizeValidation", () => {});
测试时指定规则集:
[Test] public void Fail_when_min_below_min_limit() { // ... 其他测试代码不变 // 只验证MinLimitValidation规则集 var result = sut.TestValidate(resource, ruleSet: "MinLimitValidation"); result.ShouldHaveValidationErrorFor(c => c.MinSize); } [Test] public void Fail_when_min_above_preferred_size() { // ... 其他测试代码不变 // 只验证PreferredSizeValidation规则集 var result = sut.TestValidate(resource, ruleSet: "PreferredSizeValidation"); result.ShouldHaveValidationErrorFor(c => c.MinSize); }
备注:内容来源于stack exchange,提问作者void.pointer
相关产品推荐
相关产品推荐

