[英]C# UnitTest void static method
我正在嘗試對應用程序中的記錄器進行單元測試。 例如我需要測試方法Logger.info("some message")
,但是這個方法是 static 並返回 void。 在谷歌上搜索我知道我必須使用起訂量,但無法在 UnitTest class 上實現它。 Logger 構造函數沒有參數,在x.Debug
中我有一個錯誤,說我無法從實例引用訪問。 有沒有辦法在不編輯生產代碼的情況下實現 UnitTest?
[TestClass()]
public class LoggerTests
{
[TestMethod()]
public void DebugTest()
{
var mock = new Mock<Logger>();
mock.Setup(x => x.Debug(It.IsAny<string>());
new Logger(mock.Object).AddLog("testing");
mock.VerifyAll;
}
}
程序.cs
private static void ConfigureLogger()
{
Logger.AddLog(new NLogAppender());
Logger.Level = TraceLevel.Verbose;
Logger.Info("Configured Logger");
}
記錄器.cs
public class Logger
{
public static readonly List<IAppender> loggings = new List<IAppender>();
public static void AddLog(IAppender appender)
{
loggings.Add(appender);
}
public static TraceLevel Level { get; set; }
static Logger()
{
Level = TraceLevel.Verbose;
}
public static void Info(string message)
{
LogMessage(message);
}
}
NlogAppender.cs
public class NLogAppender : IAppender
{
public NLog.Logger logger;
public NLogAppender()
{
logger = LogManager.GetLogger(nameof(NLogAppender));
}
public void AddLog(string str)
{
}
}
IAppender.cs
public interface IAppender
{
void AddLog(string str);
}
您不能模擬 static class,也不應該模擬被測類/系統。
向記錄器添加一個模擬附加程序:
// Arrange
var logString = "test-info"
var appenderMock = new Mock<IAppender>();
appenderMock.Setup(a => a.AddLog(logString));
Logger.AddLog(appenderMock.Object);
// Act
Logger.Info(logString);
// Assert
// TODO: exactly once
appenderMock.VerifyAll();
請注意,此 static class 可能會在測試之間保留數據,從而導致意外結果,請咨詢您的測試框架以進行配置。
除此之外,您通常不想推出自己的日志記錄基礎設施,您可能會做錯很多事情,為什么要重新發明輪子? 大量的ILogger(<T>)
實現。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.