Как я могу выполнить модульное тестирование проверки «больше чем», созданной с помощью бесплатной проверки? - PullRequest
0 голосов
/ 11 марта 2020

У меня есть свойство, подобное следующему:

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

1 Ответ

1 голос
/ 12 марта 2020

Вы можете сделать это обоими способами.

На основании предоставленной информации, если ваш класс 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, и есть случаи, когда вы хотите это сделать (я использую его, когда мой класс имеет коллекцию дочерних объектов, и я хочу протестировать правило проверки для заданного c дочернего объекта), а затем следующее функционально эквивалентно предыдущему:

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