我有一段代码,旨在充当中间件,负责在执行任意代码之前和之后记录时间戳,并捕获它可能引发的任何异常,记录它们并重新抛出它们。我一直在努力设计一个测试,以确保中间件不会影响原始代码的堆栈跟踪。
到目前为止,我已经尝试过了
[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)
(在过程中重写stacktrace),即使它不应该通过测试,完全没有。
答案 0 :(得分:0)
可能是异常被包装在_testSubject
内的某个地方。如果这种包装是不可接受的,则可以检查引发异常的特定方法,如下所示:
Assert.Equal(
ex.TargetSite,
typeof(ErrorMiddleware).GetMethod(nameof(ErrorMiddleware.Invoke), BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic));