Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 模拟子验证器时FluentValidation引发的NullReference异常_C#_Fluentvalidation_Nsubstitute_Fluent Assertions - Fatal编程技术网

C# 模拟子验证器时FluentValidation引发的NullReference异常

C# 模拟子验证器时FluentValidation引发的NullReference异常,c#,fluentvalidation,nsubstitute,fluent-assertions,C#,Fluentvalidation,Nsubstitute,Fluent Assertions,从简单的事情开始: public interface IChild { string Value { get; } } public class ChildValidator : AbstractValidator<IChild> { public ChildValidator() { RuleFor(c => c.Value) .NotEmpty() .NotEmpty() .WithMessage("Friendly

从简单的事情开始:

public interface IChild
{
  string Value { get; }
}

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

资料来源:“FluentValidation”

堆栈跟踪:

在中的FluentValidation.Validators.ChildValidatorAdapter.Validate(PropertyValidatorContext上下文)处

/home/jskinner/code/FluentValidation/src/FluentValidation/Validators/childvalidatoradapter.cs:第56行

在中的FluentValidation.Internal.PropertyRule.InvokePropertyValidator(ValidationContext上下文,IPropertyValidator验证器,字符串propertyName)处

/home/jskinner/code/FluentValidation/src/FluentValidation/Internal/PropertyRule.cs:第442行

在FluentValidation.Internal.PropertyRule.d_u65.MoveNext()中

在/home/jskinner/code/FluentValidation/src/FluentValidation/Internal/PropertyRule.cs中:第282行

在System.Linq.Enumerable.SelectManySingleSelectorIterator`2.MoveNext()中

位于System.Linq.Enumerable.WhereEnumerableInterator`1.MoveNext()

在FluentValidation.AbstractValidator
1.中验证(ValidationContext
1上下文)

/home/jskinner/code/FluentValidation/src/FluentValidation/AbstractValidator.cs:第115行

在/home/jskinner/code/FluentValidation/src/FluentValidation/AbstractValidator.cs中的FluentValidation.AbstractValidator`1.Validate(T instance)处:第83行

在SubValidationTest.Program.Test\u ParentValidator\u和mockedchildvalidator()中

我是否还需要在模拟的验证器上模拟其他东西,以使其正确工作


我无法在DotNetFiddle上运行此代码:(

从堆栈跟踪来看,它似乎无法运行

 FluentValidation.AbstractValidator1.Validate(ValidationContext1 context)
不是在模拟上配置的成员之一

这应该像预期的那样

[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();
}
[TestMethod]
公共无效测试\u ParentValidator\u和MockedChildValidator(){
var child=Substitute.For();
var childValidator=Substitute.For();
var parent=Substitute.For();
var validator=新的ParentValidator(childValidator);
parent.Child.Returns(null作为IChild);
validator.Validate(parent.IsValid.Should().BeTrue();
父.子.返回(子);
var failedResult=new ValidationResult(新列表{new ValidationFailure(“属性”、“消息”)});
验证(Arg.Any())。返回(failedResult);
validator.Validate(parent.IsValid.Should().BeFalse();
var validResult=新的ValidationResult();
validator.Validate(Arg.Any()).Returns(validResult);
validator.Validate(parent.IsValid.Should().BeTrue();
}
是的,显然子验证器会被另一个重载调用。
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();
}
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();
}
 FluentValidation.AbstractValidator1.Validate(ValidationContext1 context)
[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();
}