我正在嘗試對應用程式中的記錄器進行單元測驗。例如,我需要測驗該方法Logger.info("some message"),但該方法是靜態的并回傳無效。在 Google 上搜索我知道我必須使用 Moq,但無法在 UnitTest 類上實作它。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);
}
uj5u.com熱心網友回復:
您不能模擬靜態類,也不應該模擬被測類/系統。
向記錄器添加一個模擬 appender:
// 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();
請注意,此靜態類可能會在導致意外結果的測驗之間保留資料,請咨詢您的測驗框架以進行配置。
除此之外,您通常不想推出自己的日志記錄基礎架構,您可能會做錯很多事情,為什么要重新發明輪子?ILogger(<T>)周圍有很多實作。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/366891.html
