fluent validation pipeline for unit testing

53 Views Asked by At

In attempt to recreate unit testing framework, I'm missing something in the startup/program.cs to facilitate the abstract validator to return a bad request on an invalid Json request object.

I'm using the Mediatr framework to handle the request(s) of my controller.

It throws the 400 during a Swagger instance, however, it doesn't return the 400 as expected during the unit test portion.

I have the FluentValidation, FluentValidation.AspNetCore, FluentValidation.DependencyInjectionExtensions added as dependencies and added to the pipeline.

I've added the following to program.cs

builder.Services.AddFluentValidationAutoValidation();
builder.Services.AddFluentValidationClientsideAdapters();

builder.Services.AddValidatorsFromAssembly(Assembly.GetExecutingAssembly());
builder.Services.AddFluentValidationAutoValidation().AddFluentValidationClientsideAdapters();

The validator:

public class StateUsaPriceValidator : AbstractValidator<Request>
{
    public StateUsaPriceValidator()
    {
        RuleFor(x => x.State).NotEmpty().NotNull();
    }
}

Request model:

public partial class StateUsaPrice
{
    public class Request : IRequest<Response>
    {
        public string State { get; set; }
    }
.
.
    public class Response
    {
        public bool success { get; set; }
        public Result Results { get; set; }

        public class Result
        {
            public State State { get; set; }
            public IEnumerable<City> Cities { get; set; }
        }
    .
    .
    .
    }
.
}

my sut test:

[Fact]
public async void GetStateUsaPrice_ShouldReturn_BadRequest_When_Request_State_IsNull()
{
    var mediatorMock = new Mock<IMediator>();
    Actions.StateUsaPrice.Request request = null;
    var controller = GetController(mediatorMock);
    Actions.StateUsaPrice.Response response = new();

    mediatorMock.Setup(m => m.Send(It.IsAny<Actions.StateUsaPrice.Request>(), It.IsAny<CancellationToken>())).Returns(Task.FromResult(response));

    var result = await controller.StateUsaPrice(request);

    Assert.True(((ObjectResult)result).StatusCode == StatusCodes.Status400BadRequest);
}

simple Controller:

    [HttpGet(Name = "StateUsaPrice")]
    [Produces("application/json")]
    [ProducesResponseType(StatusCodes.Status200OK)]
    [ProducesResponseType(StatusCodes.Status400BadRequest)]
    public async Task<IActionResult> StateUsaPrice([FromQuery] Actions.StateUsaPrice.Request request)
    {
        var result = await _mediator.Send(request).ConfigureAwait(false);
        if (result is null || result.success == false)
            return NoContent();
        return new ObjectResult(result) { StatusCode = StatusCodes.Status200OK };
    }

I'm getting a 204 (no content) instead of 400 (bad request).

I'm have a good guess there's missing declarations in the pipeline, just not sure what it is.

0

There are 0 best solutions below