【问题标题】:How can I unit test a "greater than" validation created with fluent validation?如何对使用流利验证创建的“大于”验证进行单元测试?
【发布时间】:2020-03-11 15:06:46
【问题描述】:

我有如下属性:

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

在流利验证的文档中,他们指定如果我不能使用“ShouldHaveValidationErrorFor”方法,我可以使用“验证”方法做出一些断言,但我无法理解这一点

我得到的都是这样的:

    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, ??)
    }

【问题讨论】:

  • 你的意思是像result.ShouldHaveValidationErrorFor(x => x.Foo);
  • 但是这样做可以确保属性失败,因为 Foo 不大于零?
  • ShouldHaveValidationErrorFor 方法的名称非常明确,你认为它有什么作用?

标签: c# unit-testing validation fluentvalidation


【解决方案1】:

这两种方法都可以。

根据提供的信息,假设您的 Bar 类和 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 方法,并且在某些情况下您确实想这样做(我在我的类有一组子对象时使用它,并且我想在特定的子对象),那么下面的功能等同于前面的:

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);
    }
}

【讨论】:

  • 谢谢,我最终做了类似的事情
猜你喜欢
  • 1970-01-01
  • 2016-08-24
  • 1970-01-01
  • 1970-01-01
  • 2015-04-30
  • 2019-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多