我试图写一个模拟记录器。 我想写模拟吗?我收到了发送到日志的消息。
var logger = Substitute.For <ILogger> ();
logger.AddMessage (ProtocolMessageTypes.Debug, "blah bar");
logger.AddMessage (ProtocolMessageTypes.Error, "Error");
最好接收它(注意:接口ILogger不包含方法GetMessage())
List <ILogMessages> messages = Logger.GetMessages ()
答案 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");
}