Tom Jones

Verifying FluentValidation in unit tests

Assuming a class with a custom validator, similar to the following:

1public record FeedbackCreateRequest
2{
3 public string Url { get; set; } = null!;
4
5 public FeedbackResponse Response { get; set; } // An enum consisting of 3 options
6
7 public string? Context { get; set; }
8
9 public class Validator : AbstractValidator<FeedbackCreateRequest>
10 {
11 public Validator()
12 {
13 RuleFor(request => request.Url)
14 .NotEmpty();
15
16 RuleFor(request => request.Response)
17 .IsInEnum();
18
19 RuleFor(request => request.Context)
20 .MaximumLength(250);
21 }
22 }
23}

You can easily verify the request object is being validated as you expect by instantiating the validator and calling ShouldHaveValidationErrorFor:

1[Fact]
2public async Task FeedbackCreateRequestValidator_InvalidFields_IncludesRelevantErrors()
3{
4 // Arrange
5 var validator = new FeedbackCreateRequest.Validator();
6
7 var request = new FeedbackCreateRequest
8 {
9 Response = (FeedbackResponse)5,
10 Context = new string('a', 251),
11 };
12
13 // Act
14 var result = await validator.TestValidateAsync(request);
15
16 // Assert
17 Assert.Equal(3, result.Errors.Count);
18 result.ShouldHaveValidationErrorFor(feedback => feedback.Url);
19 result.ShouldHaveValidationErrorFor(feedback => feedback.Response);
20 result.ShouldHaveValidationErrorFor(feedback => feedback.Context);
21}