如何使用NSubstitute来模拟记录器

时间:2018-02-06 11:24:57

标签: c# unit-testing

我试图写一个模拟记录器。 我想写模拟吗?我收到了发送到日志的消息。

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

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

最好接收它(注意:接口ILogger不包含方法GetMessage())

List <ILogMessages> messages = Logger.GetMessages ()

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

这真的很简单。我稍微修改了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");
    }

答案 2 :(得分:0)

这取决于您使用的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");
}