Как проверить, что код повторно генерирует исключение _with__ изменение трассировки стека? - PullRequest
1 голос
/ 17 мая 2019

У меня есть фрагмент кода, который предназначен для использования в качестве промежуточного программного обеспечения в метках времени регистрации платежей до и после выполнения произвольного фрагмента кода, а также для перехвата любых исключений, которые он может выдать, регистрации их и перебрасывания. Я застрял, пытаясь создать тест, который бы удостоверился, что промежуточное программное обеспечение не влияет на трассировку стека, которую выкинул исходный код.

Я уже пробовал это

[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) (переписывая в стеке трассировку в процессе), тест все равно пройдет, даже если он вообще не должен.

1 Ответ

0 голосов
/ 17 мая 2019

Возможно, исключение заключено где-то внутри _testSubject. Если эта упаковка неприемлема, можно проверить определенный метод, который выдает исключение, например:

    Assert.Equal(
            ex.TargetSite, 
            typeof(ErrorMiddleware).GetMethod(nameof(ErrorMiddleware.Invoke), BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...