簡體   English   中英

C# UnitTest 無效 static 方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM