开发者

Is it possible to mock NLog log methods?

Is it开发者_Go百科 possible/easy to mock NLog log methods, using Rhino Mocks or similar?


Using Nuget : install-package NLog.Interface

Then: ILogger logger = new LoggerAdapter([logger-from-NLog]);


You can only mock virtual methods. But if You create some interface for logging and then implement it using NLog You can use dependency injection and in Your tests use mocked interface to see if system under test (SUT) is logging what You expect it to log.

public class SUT
{
  private readonly ILogger logger;
  SUT(ILogger logger) { this.logger = logger;}
  MethodUnderTest() {
    // ...
    logger.LogSomething();
    // ...
  }
}

// and in tests
var mockLogger = new MockLogger();
var sut = new SUT(mockLogger);
sut.MethodUnderTest();
Assert.That("Expected log message", Is.Equal.To(mockLogger.LastLoggedMessage));


The simple answer, is 'no'. Looking at the code, dependency-injection is not supported, which seems rather an oversight, especially as it doesn't look difficult to implement (at first glance).

The only interfaces in the project are there to support COM interop objects and a few other things. The main Logger concrete class neither implements an interface, nor provides virtual methods.

You could either provide an interface yourself, or use Moles/TypeMock/ another isolation framework to mock the dependency.


I've used code like this to stub out the NLog logging code. You can make use of NLog's MemoryTarget which just keeps messages in memory until it's disposed of. You can query the content of the log using Linq or whatever (this example uses FluentAssertions)

    using FluentAssertions
    using Microsoft.VisualStudio.TestTools.UnitTesting;
    using NLog;
    using NLog.Config;
    using NLog.Targets;

    ...

    private MemoryTarget _stubLogger;

    [TestInitialize]
    public void Setup()
    {
        ConfigureTestLogging();
    }

    protected virtual LoggingConfiguration GetLoggingConfiguration()
    {
        var config = new NLog.Config.LoggingConfiguration();
        this._stubLogger = new MemoryTarget();

        _stubLogger.Layout = "${level}|${message}";
        config.AddRule(LogLevel.Debug, LogLevel.Fatal, this._stubLogger);

        return config;
    }

    protected virtual void ConfigureTestLogging()
    {
        var config = GetLoggingConfiguration();

        NLog.LogManager.Configuration = config;
    }

    [TestMethod]
    public void ApiCallErrors_ShouldNotThrow()
    {
        // arrange
        var target = new Thing();
        
        // act
        target.DoThing();

        // assert
        this._stubLogger.Logs.Should().Contain(l => 
            l.Contains("Error|") && 
            l.Contains("Expected Message"));
    }
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜