gpt4 book ai didi

c# - 具有子类/子类的类的单元测试 FluentValidation 规则

转载 作者:太空狗 更新时间:2023-10-29 18:27:21 25 4
gpt4 key购买 nike

当我们正在验证的对象具有也在验证的子类时,是否可以为 fluentvalidation 类编写单元测试。

举个例子:我的类(class)看起来像这样

public class TestModel
{

public class SubData
{
public int SubDataVal { get; set; }
}

public int ParentVal { get; set; }
public SubData Sub { get; set; }

}

我的验证逻辑是这样的:

public class TestModelValidator : AbstractValidator<TestModel>
{
public TestModelValidator()
{
RuleFor(o => o.ParentVal).GreaterThan(0);
RuleFor(o => o.Sub.SubDataVal).GreaterThan(0);
}
}

当我写下面的单元测试时

    [Test]
public void Should_have_error_when_val_is_zero()
{
validator = new TestModelValidator();
validator.ShouldHaveValidationErrorFor(model => model.ParentVal, 0);
}

我收到“System.NullReferenceException:对象引用未设置为对象的实例”。异常(exception)FluentValidation.TestHelper.ValidatorTester`2.ValidateError(T instanceToValidate)

(如果我删除 RuleFor(o => o.Sub.SubDataVal).GreaterThan(0); 行,那么它会起作用!)

同样,如果我尝试对实际的子类进行单元测试:

    [Test]
public void Should_have_error_when_sub_dataVal_is_zero()
{
validator = new TestModelValidator();
validator.ShouldHaveValidationErrorFor(model => model.Sub.SubDataVal, 0);
}

我收到“System.Reflection.TargetException:对象与目标类型不匹配。”来自 FluentValidation.TestHelper.ValidatorTester`2.ValidateError(T instanceToValidate)

最佳答案

您可以对模型和子模型进行单元测试,但您需要更改验证类以使用单独的验证器类来验证子模型:

public class TestModelValidator : AbstractValidator<TestModel>
{
public TestModelValidator()
{
RuleFor(o => o.ParentVal).GreaterThan(0);
RuleFor(o => o.Sub).SetValidator(new SubDataValidator());
}
}

public class SubDataValidator : AbstractValidator<SubData>
{
public SubDataValidator()
{
RuleFor(o => o.SubDataVal).GreaterThan(0);
}
}

然后您可以编写单元测试来测试每个验证器或同时测试两者。

关于c# - 具有子类/子类的类的单元测试 FluentValidation 规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13915439/

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