【问题标题】:FluentValidation ShouldHaveValidationErrorFor with SetCollectionValidatorFluentValidation ShouldHaveValidationErrorFor 与 SetCollectionValidator
【发布时间】:2021-10-21 05:02:39
【问题描述】:

我在 ASP.NET MVC 项目中使用 FluentValidation 库,从 UI 角度来看,它按预期工作。违反规则会显示正确的错误。

我有一个父类,它有一个验证器和一个集合属性,其中该类型有一个验证器。它在概念上与documentation 中描述的相同。

我有一个父类的验证器...

public class MyFormValidator : AbstractValidator<MyFormViewModel>

...我在MyFormViewModel...中有一个收藏集...

public IList<ChildRow> ChildRowsAdded { get; set; }

...我为该子类的集合创建了一个验证器...

public class ChildRowValidator : AbstractValidator<ChildRow>

...我在父验证器中使用该子验证器...

RuleFor(m => m.ChildRowsAdded).SetCollectionValidator(new ChildRowValidator());

在编写一些单元测试时,我注意到ShouldHaveValidationErrorFor 没有确认错误存在。

_validator.ShouldHaveValidationErrorFor(x => x.ChildRowsAdded, model);

我测试中的那一行似乎没有看到错误。测试失败,消息说

FluentValidation.TestHelper.ValidationTestException : 预期 属性 AllergyRowsAdded 的验证错误。

如果我手动 .Validate() 并查看结果,我会看到错误。

以前有人遇到过这种情况吗?在这种情况下,我是否需要采取额外的步骤才能使用 ShouldHaveValidationErrorFor

【问题讨论】:

  • 我以为你可以使用validator.ShouldHaveValidationErrorFor(m =&gt; m.Childs[0].Name, model);,但它也不起作用。当我查看 FluentValidation 源代码时,似乎无法将ShouldHaveValidationErrorFor assert 用于此类测试。
  • 对于任何感兴趣的人,我在项目的讨论板上交叉发布了此内容,并在那里获得了更多详细信息。 fluentvalidation.codeplex.com/discussions/580454#post1351410

标签: asp.net-mvc fluentvalidation


【解决方案1】:

Jookin 的评论绝对正确:

ShouldHaveValidationErrorFor 方法并非旨在验证属性的属性,您可以阅读它here

有两种解决方案:

  1. 使用ShouldHaveValidationErrorFor并直接测试ChildRowValidator,像这样:_childValidator.ShouldHaveValidationErrorFor(x => x.Name, childModel); // direct descendant property can be validated
  2. 避免使用此辅助方法并使用Assert 类检查,如果在ValidationResult 对象中存在任何名称错误,通过正则表达式或简单字符串比较匹配您的数组项属性。

选择一个,更符合你的目的。

【讨论】:

    【解决方案2】:

    根据the docs,还有另一种测试嵌套属性的方法:一个字符串名称,表示嵌套属性的路径:

    // You can also use a string name for properties that can't be easily represented with a lambda, eg:
    result.ShouldHaveValidationErrorFor("Addresses[0].Line1");
    

    【讨论】:

      猜你喜欢
      • 2014-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-21
      • 2017-04-12
      • 1970-01-01
      相关资源
      最近更新 更多