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.