Редактирование на основе OP. Edit:
Поскольку NumberOfTrainings
является обнуляемым int, я бы написал правило (используя ваши сообщения), чтобы убедиться, что оно не равно нулю и имеет значение больше 0 следующим образом:
RuleFor(x => x.NumberOfTrainings)
.NotNull().WithMessage("Number of trainings can't be empty.")
.GreaterThan(0).WithMessage("Number of trainings must be greater than 0.");
Сокращенный набор тестов для этого правила будет следующим:
var fixture = new Fixture();
var validator = new TrainingDtoValidator();
var dto1 = fixture.Build<TrainingDto>().Without(x => x.NumberOfTrainings).Create();
validator.ShouldHaveValidationErrorFor(x => x.NumberOfTrainings, dto1).WithErrorMessage("Number of trainings can't be empty.");
var dto2 = fixture.Build<TrainingDto>().With(x => x.NumberOfTrainings, -1).Create();
validator.ShouldHaveValidationErrorFor(x => x.NumberOfTrainings, dto2).WithErrorMessage("Number of trainings must be greater than 0.");
var dto3 = fixture.Build<TrainingDto>().With(x => x.NumberOfTrainings, 0).Create();
validator.ShouldHaveValidationErrorFor(x => x.NumberOfTrainings, dto3).WithErrorMessage("Number of trainings must be greater than 0.");
var dto4 = fixture.Build<TrainingDto>().With(x => x.NumberOfTrainings, 1).Create();
validator.ShouldNotHaveValidationErrorFor(x => x.NumberOfTrainings, dto4);
Предыдущий:
public int NumberOfTrainings { get; set; }
согласно этому определению не может быть нулевым и не может быть «не числом». Поэтому валидатор пользовательского свойства
.Must((x, list, context) =>
{
if (x.NumberOfTrainings.ToString() != "")
{
context.MessageFormatter.AppendArgument("NumberOfTrainings", x.NumberOfTrainings);
return Int32.TryParse(x.NumberOfTrainings.ToString(), out int number);
}
return true;
})
.WithMessage("Number of trainings must be a number.");
, который преобразует NumberOfTrainings
в строку, а затем пытается проанализировать ее в Int32
, является излишним. Я даже не уверен, что NotEmpty
будет работать так, как вы ожидаете, поскольку int по умолчанию равен 0, что я бы не назвал пустым. Может быть, это проверяет int.MinValue или что-то. Обычно я написал бы правило int, используя валидатор больше / меньше или *.
Можете ли вы уточнить, что такое «действительный NumberOfTrainings»? возможно> = 0? Тогда можно дать лучший ответ.