如何测试该代码在不更改堆栈跟踪的情况下重新引发异常?

时间:2019-05-17 14:58:40

标签: c# xunit

我有一段代码,旨在充当中间件,负责在执行任意代码之前和之后记录时间戳,并捕获它可能引发的任何异常,记录它们并重新抛出它们。我一直在努力设计一个测试,以确保中间件不会影响原始代码的堆栈跟踪。

到目前为止,我已经尝试过了

[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),即使它不应该通过测试,完全没有。

1 个答案:

答案 0 :(得分:0)

可能是异常被包装在_testSubject内的某个地方。如果这种包装是不可接受的,则可以检查引发异常的特定方法,如下所示:

    Assert.Equal(
            ex.TargetSite, 
            typeof(ErrorMiddleware).GetMethod(nameof(ErrorMiddleware.Invoke), BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic));