gpt4 book ai didi

.net - 使用嵌套验证对复杂模型进行单元测试

转载 作者:行者123 更新时间:2023-12-04 02:21:56 26 4
gpt4 key购买 nike

我正在使用 fluentvalidation 进行模型验证。我有一个包含几个嵌套类或类集合的类,每个类都有自己的 IValidator。最初我正在做这样的事情来设置嵌套验证器:

RuleFor(foo => foo.Header).SetValidator(new FooHeaderValidator());

这很好用。

当我开始实现更多的嵌套验证器时,我开始意识到我的单元测试对于顶级验证是多么脆弱。基本上,对子验证器的任何更改都可能导致意外行为并导致测试失败。显然这是由于我直接实例化了子验证器。我现在通过构造函数注入(inject)来获取这种依赖关系。这让我可以模拟 FooHeaderValidator .

我现在的测试失败了 null reference来自流利验证的某个地方的异常。我只能假设在某个地方有人要求我的模拟没有提供。这是来自 fluentvalidation 的堆栈跟踪:
   at FluentValidation.Validators.ChildValidatorAdaptor.Validate(PropertyValidatorContext context)
at FluentValidation.Validators.DelegatingValidator.Validate(PropertyValidatorContext context)
at FluentValidation.Internal.PropertyRule.InvokePropertyValidator(ValidationContext context, IPropertyValidator validator, String propertyName)
at FluentValidation.Internal.PropertyRule.<Validate>d__8.MoveNext()
at System.Linq.Enumerable.<SelectManyIterator>d__14`2.MoveNext()
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at System.Linq.Enumerable.ToList(IEnumerable`1 source)
at FluentValidation.AbstractValidator`1.Validate(ValidationContext`1 context)
at FluentValidation.AbstractValidator`1.Validate(T instance)

有没有人遇到过这个并知道我错过了什么?我是不是因为 mock 这些验证者而疯狂?

最佳答案

所以这实际上很简单。答案是您需要为 Validate 设置模拟。接受 ValidationContext<T> 的覆盖.在 RhinoMocks 中,这看起来像:

public static IValidator<T> GetMockedNestedValidator<T>()
{
var mockedValidator = MockRepository.GenerateMock<IValidator<T>>();
abstractValidator.Stub(x => x.Validate(Arg<ValidationContext<T>>.Is.Anything)).Return(new ValidationResult());
return mockedValidator;
}

起订量非常相似:
public static Mock<IValidator<T>> GetMockedNestedValidator<T>()
{
var mockedValidator = new Mock<IValidator<T>>();
abstractValidator.Setup(x => x.Validate(Arg<ValidationContext<T>>.Is.Anything)).Returns(new ValidationResult());
return mockedValidator;
}

关于.net - 使用嵌套验证对复杂模型进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15486659/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com