如何对使用流畅验证创建的 "greater than" 验证进行单元测试?

How can I unit test a "greater than" validation created with fluent validation?

我有一个 属性 如下所示:

    RuleFor(c => c.foo).GreaterThan(0);

在fluent validation的文档中,他们指定如果我不能使用"ShouldHaveValidationErrorFor"方法,我可以用"Validate"方法做一些断言,但我不能包头围绕这个

我得到的只是这样的东西:

    public void Should_Have_Error_When_Foo_Isnt_Greater_Than_Zero()
    {
        var bar = new Bar
        {
            Foo = -1
        };

        var result = validator.TestValidate(bar);

        //Assert.True(bar.Foo > 0, ??)
    }

两种方式都可以。

根据提供的信息,假设您的 Bar class 和 BarValidator 如下所示:

public class Bar
{
    public int Foo { get; set; }
}

public class BarValidator : AbstractValidator<Bar>
{
    public BarValidator()
    {
        RuleFor(c => c.Foo).GreaterThan(0);
    }
}

...我通常只针对验证器执行此操作,这样更整洁。以下代码测试通过和失败状态。

public class BarValidatorTests
{
    [Test]
    public void Foo_Zero_HasValidationError()
    {
        var validator = new BarValidator();
        var dto = new Bar { Foo = 0 };

        validator.ShouldHaveValidationErrorFor(x => x.Foo, dto);
    }

    [Test]
    public void Foo_One_DoesNotHaveValidationError()
    {
        var validator = new BarValidator();
        var dto = new Bar { Foo = 1 };

        validator.ShouldNotHaveValidationErrorFor(x => x.Foo, dto);
    }
}

如果你确实想使用 TestValidate 方法,并且在某些情况下你确实想这样做(我在 class 有子对象集合时使用它,我想在特定的子对象上测试验证规则),那么以下在功能上等同于之前的:

public class BarValidatorTestsUsingTestValidate
{
    [Test]
    public void Foo_Zero_HasValidationError()
    {
        var validator = new BarValidator();
        var dto = new Bar { Foo = 0 };

        var validationResults = validator.TestValidate(dto);

        validationResults.ShouldHaveValidationErrorFor(x => x.Foo);
    }

    [Test]
    public void Foo_One_DoesNotHaveValidationError()
    {
        var validator = new BarValidator();
        var dto = new Bar { Foo = 1 };

        var validationResults = validator.TestValidate(dto);

        validationResults.ShouldNotHaveValidationErrorFor(x => x.Foo);
    }
}