Я пытаюсь написать какой-нибудь тест для XUnit, в частности, мне бы хотелось иметь тест, который бы гарантировал, что при возникновении определенного исключения он будет преобразован в значимый код ошибки. Я уже настроил глобальную промежуточную программу обработки ошибок, и она работает правильно. Ниже приведен пример кода, показывающего, как работает мое решение:
Мой контроллер с конечной точкой почты, который может возвращать 200 или 404
//Controller
[HttpPost]
[ProducesResponseType(200)]
[ProducesResponseType(404)]
public async Task<StatusCodeResult> Create([FromBody] Request request) {
//Process request
handler.Handle(request);
return Ok();
}
Промежуточное программное обеспечение для глобальной обработки ошибок, которое преобразует исключения вКоды ошибок
//StartUp Middleware
app.UseExceptionHandler(builder => {
builder.Run(handler: async context => {
IExceptionHandlerFeature error = context.Features.Get<IExceptionHandlerFeature>();
if (error != null) {
int statusCode = (int)GetStatusCodeForException(error.Error);
context.Response.StatusCode = statusCode;
context.Response.ContentType = "application/json";
await context.Response.WriteAsync(new ErrorDetails { StatusCode = statusCode, Message = error.Error.Message }.ToString());
}
});
});
И затем мой тест, в котором я устраиваю некоторые макеты, создаю экземпляр контроллера и вызываю метод Create
//UnitTest
[Fact]
public async Task Test()
{
//Arrange
var mockHandler = new Mock<IHandler>();
mockHandler.Setup(handler => handler.Handle(It.IsAny<Request>())).Throws(new CustomException(It.IsAny<string>()));
MyController myController = new MyController();
//Act
var statusCodeResult = await myController.Create(request);
//Assert
StatusCodeResult result = Assert.IsType<NotFoundResult>(statusCodeResult);
}
Здесь я хочу убедиться, что CustomException переназначен вкод состояния 404. Как это сделать? Любая помощь приветствуется.