Приведенный ниже код упрощен для демонстрационных целей.
Конечная точка:
Код: Выделить всё
[HttpGet]
[Route("machines/{idMachine:guid}/admin")]
[Authorize(Policy = Policies.RequireMachineCustomerCheck)]
public IActionResult MachineEditor(Guid idMachine)
{
// Lookup machine...
if (machine == null)
{
throw new Exception("Exception");
}
}
Код: Выделить всё
[Fact]
public async Task MachineNotFoundShouldThrowException()
{
var idMachine = Guid.NewGuid();
var uri = new Uri($"/machines/{idMachine}/admin", UriKind.Relative);
var httpClient = new HttpClient();
var response = await httpClient.GetAsync(uri);
response.StatusCode.ShouldBe(HttpStatusCode.InternalServerError);
}
Во время выполнения запроса произошло необработанное исключение. .
System.Exception: в кэше в памяти сервера не удалось найти компьютер с идентификатором компьютера
7f6825f9-3e4c-4d32-aace-ec9128394e0c. Либо кэш устарел
, либо идентификатор неверен.
в Proseal.Portal.Services.Utilities.CacheHelper.GetProVisionMachine(Guid
idMachine) в
D: \a\1\s\Proseal\Portal.Services\Utilities\CacheHelper.cs:строка 72
в Proseal.Portal.Server.Common.Authorisation.MachineCustomerCheckHandler.HandleRequirementAsync(AuthorizationHandlerContext
контекст, требование MachineCustomerCheck) в
D:\a\1\s\Proseal\Portal.Server\Common\Authorisation\MachineCustomerCheck.cs:line
83
в Microsoft.AspNetCore.Authorization.AuthorizationHandler
Код: Выделить всё
1.HandleAsync(AuthorizationHandlerContext context) at Microsoft.AspNetCore.Authorization.DefaultAuthorizationService.AuthorizeAsync(ClaimsPrincipal user, Object resource, IEnumerable
в Microsoft.AspNetCore.Authorization.Policy.PolicyEvaluator.AuthorizeAsync(AuthorizationPolicy
policy, AuthenticateResult аутентификацияResult, контекст HttpContext,
ресурс объекта)
в Microsoft .AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext
контекст)
в Proseal.Portal.Server.Common.Middleware.AuthenticationForStaticFilesMiddleware.InvokeAsync(HttpContext
контекст, RequestDelegate следующий) в
D:\a\1\s\Proseal\Portal.Server\Common\Middleware\AuthenticationForStaticFilesMiddleware.cs:line
43
at Microsoft.AspNetCore.Builder.UseMiddlewareExtensions.c__DisplayClass6_1.d .MoveNext()
Регистрация политики аутентификации:
Код: Выделить всё
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthorization(options =>
{
options.AddPolicy(Policies.RequireMachineCustomerCheck, policy => policy.Requirements.Add(new MachineCustomerCheck()));
}
}
}
Код: Выделить всё
public class MachineCustomerCheckHandler : AuthorizationHandler
{
protected override Task HandleRequirementAsync()
{
// Lookup machine
if (machine == null)
{
throw new Exception("Exception");
}
}
Моей первой мыслью было обернуть тест в try-catch, но исключение не перехватывается.
Код: Выделить всё
try
{
var response = await httpClient.GetAsync(uri);
response.StatusCode.ShouldBe(HttpStatusCode.InternalServerError);
}
catch (Exception exception)
{
exception.Message.ShouldBe("Exception");
}
Код: Выделить всё
try
{
await Task.Run(async () => await httpClient.GetAsync(uri));
}
catch (Exception exception)
{
exception.Message.ShouldBe("Exception");
}
Код: Выделить всё
Func func = async () => await httpClient.GetAsync(uri);
await Should.ThrowAsync(func);
Подробнее здесь: https://stackoverflow.com/questions/784 ... nc-request