c# - 在 FluentValidation 中注入验证器
问题描述
这是我的设置:
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);
}
这是我喜欢进行单元测试的另一个验证器。我在嘲笑 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);
我得到一个空引用异常:
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()
不过,我的集成测试运行良好。
谢谢,阿伦
解决方案
我找到了答案:我在嘲笑 Validate 方法的错误版本。
_businessUnitIdValidatorMock.Setup(b => b.Validate(It.IsAny<ValidationContext>())).Returns(validationResultMock);
谢谢,阿伦
推荐阅读
- python - 从用户那里获取整数输入来计算 Python 函数
- python - 避免
和 被 Spacy 解析 - mysql - JavaFX 如何在另一个项目中使用我自己的 .jar 库?
- c - 如何修改 BFS 算法以在给定条件下找到 2 个顶点之间的路径?
- vue.js - 添加弹出模式以 vuetify vue.js
- python - Modifying dictionary inside function without return statement
- javascript - 有没有办法检查单元格中的单词?
- python - 为什么我们将对 numpy.random.random 的调用乘以数字并减去数字?
- python - Azure 中与 Aws SqS 最相似的队列服务是什么?
- mongodb - 插入 $out 失败