serilog-contrib / SerilogSinksInMemory

In-memory sink for Serilog to use for testing
MIT License
53 stars 7 forks source link

`WithException` assertion for comparing logged exception within specific message #27

Open rafek1241 opened 2 years ago

rafek1241 commented 2 years ago

suggestion:


            var data = new Exception("Example error exception");
            _logger.Information(data, "Example error");

            InMemorySink.Instance
                .Should()
                .HaveMessage("Example error with sensitive data")
                .WithException(data) //<-- addition
                .WithException(assertions=> assertions //<-- another variant
                   .WithMessage(data.Message)
                   .WithData("somekey",data["somekey"])
                )
sandermvanvliet commented 2 years ago

Hi @rafek1241

I'm not entirely sure yet on the way this should actually look. As part of #22 I actually added some extension methods which add HaveErrorMessageWithException<T> as part of the test case.

I'm currently thinking along the lines of adding the following:

private void GivenLogMessaageWithException()
{
    var exception = new Exception("BANG BANG!");
    exception.Data.Add("some", "property");

    _logger.Error(exception, "BANG!");
}

[Fact]
public void GivenLogMessageWithException_NewStyle()
{
    GivenLogMessaageWithException();

    _inMemorySink
        .Should()
        .HaveMessage("BANG!")
        .Appearing()
        .Once()
        .WithException<Exception>() // Asserts that there is an exception and that the type matches the expectation
        .AndMessage("BANG BANG!");
}

[Fact]
public void GivenLogMessageWithException_NewStyleFullMatch()
{
    GivenLogMessaageWithException();

    var exception = new Exception("BANG BANG!");
    exception.Data.Add("some", "property");

    _inMemorySink
        .Should()
        .HaveMessage("BANG!")
        .Appearing()
        .Once()
        .WithException<Exception>()
        .Matching(exception); // This is a shortcut for WithException<Exception>().Subject.Should().BeEquivalentTo(exception)
}

Let me know what you think.