首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在模拟子验证器时FluentValidation抛出的FluentValidation异常

在模拟子验证器时FluentValidation抛出的FluentValidation异常
EN

Stack Overflow用户
提问于 2019-09-05 16:12:19
回答 1查看 1.6K关注 0票数 2

从一些简单的事情开始:

代码语言:javascript
复制
public interface IChild
{
  string Value { get; }
}

public class ChildValidator : AbstractValidator<IChild>
{
  public ChildValidator()
  {
    RuleFor(c => c.Value)
      .NotEmpty()
      .NotEmpty()
      .WithMessage("Friendly Error Message");
  }
}

然后测试它:

代码语言:javascript
复制
static void Test_ChildValidator()
{
  var child = Substitute.For<IChild>();
  var validator = new ChildValidator();

  child.Value.Returns(null as string);
  validator.Validate(child).IsValid.Should().BeFalse();

  child.Value.Returns("");
  validator.Validate(child).IsValid.Should().BeFalse();

  child.Value.Returns("a");
  validator.Validate(child).IsValid.Should().BeTrue();
}

无例外

创建父对象和验证器:

代码语言:javascript
复制
public interface IParent
{
  IChild Child { get; }
}

public class ParentValidator : AbstractValidator<IParent>
{
  public ParentValidator(IValidator<IChild> childValidator)
  {
    When(p => p.Child != null, () => {
      RuleFor(p => p.Child)
        .SetValidator(childValidator);
    });
  }
}

然后用一个真正的子验证器测试它:

代码语言:javascript
复制
static void Test_ParentValidator_WithRealChildValidator()
{
  var child = Substitute.For<IChild>();
  var childValidator = new ChildValidator();

  var parent = Substitute.For<IParent>();
  var validator = new ParentValidator(childValidator);

  parent.Child.Returns(null as IChild);
  validator.Validate(parent).IsValid.Should().BeTrue();

  parent.Child.Returns(child);
  validator.Validate(parent).IsValid.Should().BeFalse();

  child.Value.Returns("a");
  validator.Validate(parent).IsValid.Should().BeTrue();
}

无例外.

现在,我尝试模拟子验证器(最终,我只想确保当子对象为空或非空时,子验证器Validate方法是否被调用)。

代码语言:javascript
复制
static void Test_ParentValidator_WithMockedChildValidator()
{
  var child = Substitute.For<IChild>();
  var childValidator = Substitute.For<IValidator<IChild>>();

  var parent = Substitute.For<IParent>();
  var validator = new ParentValidator(childValidator);

  parent.Child.Returns(null as IChild);
  validator.Validate(parent).IsValid.Should().BeTrue();

  parent.Child.Returns(child);

  childValidator.Validate(Arg.Any<IChild>())
    .Returns(
      new ValidationResult(
        new List<ValidationFailure> { new ValidationFailure("property", "message") }));
  validator.Validate(parent).IsValid.Should().BeFalse();

  childValidator.Validate(Arg.Any<IChild>())
    .Returns(new ValidationResult());
  validator.Validate(parent).IsValid.Should().BeTrue();
}

抛出一个NullReferenceException

资料来源:"FluentValidation“

StackTrace:

在FluentValidation.Validators.ChildValidatorAdaptor.Validate(PropertyValidatorContext上下文中) /home/jskinner/code/FluentValidation/src/FluentValidation/Validators/ChildValidatorAdaptor.cs:line 56 在FluentValidation.Internal.PropertyRule.InvokePropertyValidator(ValidationContext上下文中,IPropertyValidator验证器,字符串propertyName) /home/jskinner/code/FluentValidation/src/FluentValidation/Internal/PropertyRule.cs:line 442 在FluentValidation.Internal.PropertyRule.d__65.MoveNext() 在/home/jskinner/code/FluentValidation/src/FluentValidation/Internal/PropertyRule.cs:line 282中 在System.Linq.Enumerable.SelectManySingleSelectorIterator2.MoveNext() at System.Linq.Enumerable.WhereEnumerableIterator1.MoveNext() 在FluentValidation.AbstractValidator1.Validate(ValidationContext1上下文中) /home/jskinner/code/FluentValidation/src/FluentValidation/AbstractValidator.cs:line 115 (在FluentValidation.AbstractValidator`1.Validate(T ( /home/jskinner/code/FluentValidation/src/FluentValidation/AbstractValidator.cs:line 83 )中) 在SubValidationTest.Program.Test_ParentValidator_WithMockedChildValidator()

我还需要在模拟的验证器上模拟其他什么东西才能正确地工作吗?

pastebin -完整源代码

我无法让这段代码在DotNetFiddle上工作(完全) :(

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-05 17:44:34

从堆栈跟踪看,它似乎失败了。

代码语言:javascript
复制
 FluentValidation.AbstractValidator1.Validate(ValidationContext1 context)

它不是在模拟上配置的成员之一。

这应该和预期的一样。

代码语言:javascript
复制
[TestMethod]
public void Test_ParentValidator_WithMockedChildValidator() {
    var child = Substitute.For<IChild>();
    var childValidator = Substitute.For<IValidator<IChild>>();
    var parent = Substitute.For<IParent>();
    var validator = new ParentValidator(childValidator);
    parent.Child.Returns(null as IChild);

    validator.Validate(parent).IsValid.Should().BeTrue();

    parent.Child.Returns(child);
    var failedResult = new ValidationResult(new List<ValidationFailure> { new ValidationFailure("property", "message") });
    childValidator.Validate(Arg.Any<ValidationContext>()).Returns(failedResult);

    validator.Validate(parent).IsValid.Should().BeFalse();

    var validResult = new ValidationResult();
    childValidator.Validate(Arg.Any<ValidationContext>()).Returns(validResult);

    validator.Validate(parent).IsValid.Should().BeTrue();
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57809384

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档