简体   繁体   English

在FluentValidation中注入验证器

[英]Injecting validators in FluentValidation

This is my setup: 这是我的设置:

public class BusinessUnitIdValidator : AbstractValidator<string>
{
    public BusinessUnitIdValidator(IConfigSettings configSettings)
    {
        LovFile buidLovFile = configSettings.BuidLovFile;
        When(x => buidLovFile.IsValidationRequired.Equals("true", StringComparison.OrdinalIgnoreCase),
            () =>
            {
                RuleFor(x => x).Must((buid) => IsValidBusinessUnitId(buidLovFile, buid)).WithMessage(ValidationResultConstants.INVALID_BUSINESS_UNIT_ID);
            });
    }
}

public CreateCustomerRequestValidator(IValidator<string> _businessUnitIdValidator)
{
    RuleFor(x => x).NotNull();
    RuleFor(x => x.BusinessUnitId).NotNull().WithMessage(ValidationResultConstants.BUSINESS_UNIT_ID_SHOULD_NOT_BE_NULL);
    RuleFor(x => x.BusinessUnitId).SetValidator(_businessUnitIdValidator);
}

This is another validator that I like to unit test. 这是我要进行单元测试的另一个验证器。 I'm mocking the behavior of BusinessUnitIdValidator so it should just pass without any issues. 我正在嘲笑BusinessUnitIdValidator的行为,因此它应该可以顺利通过而没有任何问题。

List<ValidationFailure> validationFailures = new List<ValidationFailure>();
ValidationResult validationResultMock = new ValidationResult(validationFailures);
Mock<IValidator<string>> _businessUnitIdValidatorMock = new Mock<IValidator<string>>();
_businessUnitIdValidatorMock.Setup(b => b.Validate(It.IsAny<string>())).Returns(validationResultMock);
validator = new CreateCustomerRequestValidator(_businessUnitIdValidatorMock.Object);

CreateCustomerRequest createCustomerRequest = GetCreateCustomerRequest();

//Act
var validationResult = validator.Validate(createCustomerRequest);

I'm getting an null reference exception: 我收到空引用异常:

System.NullReferenceException
  HResult=0x80004003
  Message=Object reference not set to an instance of an object.
  Source=FluentValidation
  StackTrace:
   at FluentValidation.Validators.ChildValidatorAdaptor.Validate(PropertyValidatorContext context) in /home/jskinner/code/FluentValidation/src/FluentValidation/Validators/ChildValidatorAdaptor.cs:line 56
   at FluentValidation.Internal.PropertyRule.<Validate>d__65.MoveNext() in /home/jskinner/code/FluentValidation/src/FluentValidation/Internal/PropertyRule.cs:line 282
   at System.Linq.Enumerable.SelectManySingleSelectorIterator`2.MoveNext()
   at System.Linq.Enumerable.WhereEnumerableIterator`1.MoveNext()
   at FluentValidation.AbstractValidator`1.Validate(ValidationContext`1 context) in /home/jskinner/code/FluentValidation/src/FluentValidation/AbstractValidator.cs:line 115
   at Customer.UnitTests.Libraries.CustomerModelValidators.CreateCustomerRequestValidatorTests.ShouldPass() 

My integration tests are working fine though. 我的集成测试工作正常。

Thanks, Arun 谢谢,阿伦

I found the answer to this: I was mocking the incorrect version of the Validate method. 我找到了答案:我在模拟Validate方法的错误版本。

_businessUnitIdValidatorMock.Setup(b => b.Validate(It.IsAny<ValidationContext>())).Returns(validationResultMock);

Thanks, Arun 谢谢,阿伦

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM