У меня есть фрагмент кода, который предназначен для использования в качестве промежуточного программного обеспечения в метках времени регистрации платежей до и после выполнения произвольного фрагмента кода, а также для перехвата любых исключений, которые он может выдать, регистрации их и перебрасывания. Я застрял, пытаясь создать тест, который бы удостоверился, что промежуточное программное обеспечение не влияет на трассировку стека, которую выкинул исходный код.
Я уже пробовал это
[Fact]
public async Task The_Middleware_Must_Rethrow_Any_Exception_Thrown_By_The_Next_Middleware()
{
var middleware = new ErrorMiddleware();
_testSubject = new RequestLoggerMiddleware(middleware);
try
{
await _testSubject.Invoke(_mockContext.Object);
} catch (Exception ex)
{
Assert.Same(ex, middleware.ThrownException);
Assert.Equal(ex.StackTrace, middleware.ThrownException.StackTrace);
return;
}
Assert.True(false, "The middleware did not rethrow the exception");
}
private class ErrorMiddleware : OwinMiddleware
{
public Exception ThrownException { get; }
public ErrorMiddleware() : base(null)
{
ThrownException = new Exception(TestExceptionMessage);
}
public override Task Invoke(IOwinContext context)
{
throw ThrownException;
}
}
Вначале кажется, что это работает, но если я заставлю RequestLoggerMiddleware
запустить throw ex;
на его блоке catch (Exception ex)
(переписывая в стеке трассировку в процессе), тест все равно пройдет, даже если он вообще не должен.