locked
Moq and Microsoft.Extensions.Logging.ILogger unit tests failing after Microsoft.Extensions.Logging.Abstractions update RRS feed

  • Question

  • Hello,

    Some of my unit tests are failing after updating Microsoft.Extensions.Logging.Abstractions from Version=2.0.0.0 to Version=3.1.1.0.

    I have an ILogger mocked as so:

                var loggerMock = new Mock<ILogger<BillingEventProcessor>>();            
                loggerMock.Setup(l => l.Log(
                    It.IsAny<LogLevel>(), 
                    It.IsAny<EventId>(), 
                    It.IsAny<IReadOnlyList<KeyValuePair<string, object>>>(), 
                    It.IsAny<Exception>(), 
                    It.IsAny<Func<object, Exception, string>>()));

    And a unit that verifies a call to Log() has been made:

    logger.Verify(l => l.Log(
                    It.IsAny<LogLevel>(), 
                    It.IsAny<EventId>(),
                    It.IsAny<IReadOnlyList<KeyValuePair<string, object>>>(),
                    It.IsAny<Exception>(), 
                    It.IsAny<Func<object, Exception, string>>())
                );

    Prior to updating, the IReadOnlyList<KeyValuePair<string, object>> type was of type FormattedLogValues.

    In v2, FormattedLogValues was a public class but in v3.1.1, FormattedLogValues is an internal readonly struct. This changes appears to be the source of the test failure.

    I've tried using It.IsAny<object> for that 3rd parameter instead of the IReadOnlyList or FormattedLogValues, but I didn't have any luck with that.

    Anyone know how I can alter this test code to make the test pass? I can see from debugging info that a call to the Log method is made as expected, I just can't figure out how to set up these mocks correctly with the internal readonly struct parameter.

    This is a .NET Core 2.2 project.



    Thursday, May 7, 2020 11:18 PM

Answers

All replies