繁体   English   中英

如何使用 NSubstitute 来模拟记录器

[英]How to use an NSubstitute to Mock the logger

我正在尝试编写一个模拟记录器。 我想写mock这样吗? 我收到发送到日志的消息。

var logger = Substitute.For <ILogger> ();

logger.AddMessage (ProtocolMessageTypes.Debug, "blah bar");
logger.AddMessage (ProtocolMessageTypes.Error, "Error");

收到这样的消息是可取的(注意:接口 ILogger 不包含方法 GetMessage())

List <ILogMessages> messages = Logger.GetMessages ()

这取决于您使用的 Microsoft.Extensions.Logging.Abstractions。

// This works for Microsoft.Extensions.Logging.Abstractions version 2.2.0
[Test]
public void Test_NSubstitute_ILogger_2_2_0()
{
    // Given
    var logger = Substitute.For<ILogger>();

    // When
    logger.LogError("Error message");
    logger.LogInformation("Information message");


    // Then
    logger.Received(1)
        .Log(LogLevel.Error, 0, Arg.Is<object>(x=> x.ToString().Equals("Error message")), null, Arg.Any<Func<object, Exception, string>>());

    logger.Received(1)
        .Log(LogLevel.Information, 0, Arg.Is<object>(x => x.ToString().Equals("Information message")), null, Arg.Any<Func<object, Exception, string>>());
}
// This works for Microsoft.Extensions.Logging.Abstractions version 3.0.1
[Test]
public void Test_NSubstitute_ILogger_3_0_1()
{
    // Given
    var logger = Substitute.For<ILogger>();

    // When
    logger.LogError("Error message");
    logger.LogInformation("Information message");

    // Then
    logger.Received(1)
        .LogError("Error message");

    logger.Received(1)
        .LogError("Information message");
}

NSubstitute不是最简单的解决方案。

相反,编写您自己的TempLogger (或TestLogger )类,该类实现ILogger并将条目写入List<T>ConcurrentQueue<T> 然后在那里实现GetMessages ,以回放它收到的日志条目。

真的很简单。我稍微修改了 NSubsittute 帮助中的示例。 有必要使用索引器

  public interface IFoo
    {
        void SayHello(string to);
    }
    [Test]
    public void SayHello()
    {
        var cals = new List<string>();
        var foo = Substitute.For<IFoo>();
        foo.When(x => x.SayHello(Arg.Any<string>()))
            .Do(x =>
            {
                cals.Add(x[0].ToString());// use the indexer
            });
        foo.SayHello("World");
        Assert.AreEqual(cals[0], "World");
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM