diff --git a/eng/helix/content/InstallDotNet.ps1 b/eng/helix/content/InstallDotNet.ps1 index 7e8786643355..778e24dbd24e 100644 --- a/eng/helix/content/InstallDotNet.ps1 +++ b/eng/helix/content/InstallDotNet.ps1 @@ -28,8 +28,8 @@ param( & $PSScriptRoot\Download.ps1 "https://dot.net/v1/dotnet-install.ps1" $PSScriptRoot\dotnet-install.ps1 Write-Host "Download of dotnet-install.ps1 complete..." -Write-Host "Installing SDK...& $PSScriptRoot\dotnet-install.ps1 -Architecture $arch -Version $sdkVersion -InstallDir $installDir" -Invoke-Expression "& $PSScriptRoot\dotnet-install.ps1 -Architecture $arch -Version $sdkVersion -InstallDir $installDir" -Write-Host "Installing Runtime...& $PSScriptRoot\dotnet-install.ps1 -Architecture $arch -Runtime dotnet -Version $runtimeVersion -InstallDir $installDir" -Invoke-Expression "& $PSScriptRoot\dotnet-install.ps1 -Architecture $arch -Runtime dotnet -Version $runtimeVersion -InstallDir $installDir" -Write-Host "InstallDotNet.ps1 complete..." \ No newline at end of file +Write-Host "Installing SDK...& $PSScriptRoot\dotnet-install.ps1 -Architecture $arch -Version $sdkVersion -InstallDir $installDir -NoPath" +Invoke-Expression "& $PSScriptRoot\dotnet-install.ps1 -Architecture $arch -Version $sdkVersion -InstallDir $installDir -NoPath" +Write-Host "Installing Runtime...& $PSScriptRoot\dotnet-install.ps1 -Architecture $arch -Runtime dotnet -Version $runtimeVersion -InstallDir $installDir -NoPath" +Invoke-Expression "& $PSScriptRoot\dotnet-install.ps1 -Architecture $arch -Runtime dotnet -Version $runtimeVersion -InstallDir $installDir -NoPath" +Write-Host "InstallDotNet.ps1 complete..." diff --git a/src/Mvc/Mvc.Core/src/ControllerBase.cs b/src/Mvc/Mvc.Core/src/ControllerBase.cs index b24e67a7c631..5903c4126b18 100644 --- a/src/Mvc/Mvc.Core/src/ControllerBase.cs +++ b/src/Mvc/Mvc.Core/src/ControllerBase.cs @@ -1886,13 +1886,29 @@ public virtual ObjectResult Problem( 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 @@ public virtual ActionResult ValidationProblem( { 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) { diff --git a/src/Mvc/Mvc.ViewFeatures/test/ControllerUnitTestabilityTests.cs b/src/Mvc/Mvc.ViewFeatures/test/ControllerUnitTestabilityTests.cs index 63615039b14e..00a4485b8c81 100644 --- a/src/Mvc/Mvc.ViewFeatures/test/ControllerUnitTestabilityTests.cs +++ b/src/Mvc/Mvc.ViewFeatures/test/ControllerUnitTestabilityTests.cs @@ -373,7 +373,7 @@ public void ControllerAcceptedAtRoute_InvokedInUnitTests() 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 @@ public void ViewComponent_WithArguments() 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(result); + var problemDetails = Assert.IsType(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(result); + var validationProblemDetails = Assert.IsType(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 TestabilityViewTestData { get