Allow ProblemDetails \ ValidationProblemDetails to be more testable

Fixes https://github.com/dotnet/aspnetcore/issues/15166
This commit is contained in:
Pranav K 2020-08-17 16:55:03 -07:00
parent 94e314d4d2
commit 2d6fd453e2
2 changed files with 84 additions and 16 deletions

View File

@ -1886,13 +1886,29 @@ namespace Microsoft.AspNetCore.Mvc
string title = null,
string type = null)
{
var problemDetails = ProblemDetailsFactory.CreateProblemDetails(
HttpContext,
statusCode: statusCode ?? 500,
title: title,
type: type,
detail: detail,
instance: instance);
ProblemDetails problemDetails;
if (ProblemDetailsFactory == null)
{
// ProblemDetailsFactory may be null in unit testing scenarios. Improvise to make this more testable.
problemDetails = new ProblemDetails
{
Detail = detail,
Instance = instance,
Status = statusCode ?? 500,
Title = title,
Type = type,
};
}
else
{
problemDetails = ProblemDetailsFactory.CreateProblemDetails(
HttpContext,
statusCode: statusCode ?? 500,
title: title,
type: type,
detail: detail,
instance: instance);
}
return new ObjectResult(problemDetails)
{
@ -1958,14 +1974,30 @@ namespace Microsoft.AspNetCore.Mvc
{
modelStateDictionary ??= ModelState;
var validationProblem = ProblemDetailsFactory.CreateValidationProblemDetails(
HttpContext,
modelStateDictionary,
statusCode: statusCode,
title: title,
type: type,
detail: detail,
instance: instance);
ValidationProblemDetails validationProblem;
if (ProblemDetailsFactory == null)
{
// ProblemDetailsFactory may be null in unit testing scenarios. Improvise to make this more testable.
validationProblem = new ValidationProblemDetails(modelStateDictionary)
{
Detail = detail,
Instance = instance,
Status = statusCode,
Title = title,
Type = type,
};
}
else
{
validationProblem = ProblemDetailsFactory?.CreateValidationProblemDetails(
HttpContext,
modelStateDictionary,
statusCode: statusCode,
title: title,
type: type,
detail: detail,
instance: instance);
}
if (validationProblem.Status == 400)
{

View File

@ -373,7 +373,7 @@ namespace Microsoft.AspNetCore.Mvc
Assert.Equal(routeName, acceptedAtRouteResult.RouteName);
Assert.Single(acceptedAtRouteResult.RouteValues);
Assert.Equal("sample", acceptedAtRouteResult.RouteValues["route"]);
Assert.Same(value,acceptedAtRouteResult.Value);
Assert.Same(value, acceptedAtRouteResult.Value);
// Arrange
controller = new TestabilityController();
@ -682,6 +682,42 @@ namespace Microsoft.AspNetCore.Mvc
Assert.Equal(new { Arg1 = "Hi", Arg2 = "There" }, result.Arguments);
}
[Fact]
public void Problem_Works()
{
// Arrange
var detail = "Some random error";
var controller = new TestabilityController();
// Act
var result = controller.Problem(detail);
// Assert
var badRequest = Assert.IsType<ObjectResult>(result);
var problemDetails = Assert.IsType<ProblemDetails>(badRequest.Value);
Assert.Equal(detail, problemDetails.Detail);
}
[Fact]
public void ValidationProblem_Works()
{
// Arrange
var detail = "Some random error";
var controller = new TestabilityController();
// Act
controller.ModelState.AddModelError("some-key", "some-error");
var result = controller.ValidationProblem(detail);
// Assert
var badRequest = Assert.IsType<ObjectResult>(result);
var validationProblemDetails = Assert.IsType<ValidationProblemDetails>(badRequest.Value);
Assert.Equal(detail, validationProblemDetails.Detail);
var error = Assert.Single(validationProblemDetails.Errors);
Assert.Equal("some-key", error.Key);
Assert.Equal(new[] { "some-error" }, error.Value);
}
public static IEnumerable<object[]> TestabilityViewTestData
{
get