Skip to content

Instantly share code, notes, and snippets.

@marcduiker
Last active January 19, 2021 09:35
Show Gist options
  • Save marcduiker/b947f6b4f505b4cbc37b26b5fbc105cf to your computer and use it in GitHub Desktop.
Save marcduiker/b947f6b4f505b4cbc37b26b5fbc105cf to your computer and use it in GitHub Desktop.
Mocking ILogger for Azure Functions

To mock the behavior of ILogger in Azure Functions with MockBehavior.Strict (using Moq) you can use the following mock setup:

var loggerMock = new Mock<ILogger>(MockBehavior.Strict);
    loggerMock.Setup(
        log => log.Log(
            LogLevel.Error,
            It.IsAny<EventId>(), 
            It.IsAny<It.IsAnyType>(),
            It.IsAny<Exception>(),
            (Func<It.IsAnyType, Exception, string>)It.IsAny<object>()));

In the above example a mock setup is done which expects a call to logger.LogError(...).

ILogger Mock Builder

Use a builder pattern such as below to easily add a mocked ILogger to your unit test:

public class LoggerMockBuilder
{
    private readonly Mock<ILogger> _loggerMock;
    public LoggerMockBuilder()
    {
        _loggerMock = new Mock<ILogger>(MockBehavior.Strict);
    }
    public LoggerMockBuilder WithLogLevel(LogLevel level)
    {
        _loggerMock
            .Setup(
                log => log.Log(
                    level,
                    It.IsAny<EventId>(),
                    It.IsAny<It.IsAnyType>(),
                    It.IsAny<Exception>(),
                    (Func<It.IsAnyType, Exception, string>)It.IsAny<object>()));
        return this;
    }
    public Mock<ILogger> Create()
    {
        return _loggerMock;
    }
}

Then create a mock of the logger using the builder in a unit test:

 var loggerMock = new LoggerMockBuilder()
        .WithLogLevel(LogLevel.Warning)
        .Create();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment