亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

單元測試中的模擬日志單例

單元測試中的模擬日志單例

C#
守候你守候我 2021-06-23 17:10:20
我有一個記錄器類,其目的是從我的解決方案中的任何類中調用,該類決定記錄某些內容。我添加了一個接口,這就是為什么我應用了單例模式,并且沒有使用靜態類。我的 LogManager 實現(單例):https : //pastebin.com/NHKmbj9c我想編寫簡單的單元測試,它應該使用局部變量,測試每個 ILogger 方法的功能,但是一旦我的第一個單元通過,單例將在上下文中保持初始化狀態,使后續單元測試失?。ǘ麄冋趪L試初始化單身人士......)。單元測試:[TestClass]public class LogManagerTests{    [TestMethod]    public void Error_ExpectedErrorLevel_ShouldBe_Error()    {        // Arrange        var actualLevel = ErrorLevel.Warning;        const ErrorLevel expectedLevel = ErrorLevel.Error;        var iLogger = LogManager.GetInstance;        iLogger.Initialize((level, msg) => { actualLevel = level; }, null);        // Act        iLogger.Error(new Exception(), string.Empty);        // Assert        Assert.AreEqual(expectedLevel, actualLevel);    }    [TestMethod]    public void Debug_ExpectedErrorLevel_ShouldBe_Verbose()    {        // Arrange        var actualLevel = ErrorLevel.Warning;        const ErrorLevel expectedLevel = ErrorLevel.Verbose;        var iLogger = LogManager.GetInstance;        iLogger.Initialize(null, (level, msg, ex) => { actualLevel = level; });        // Act        iLogger.Debug(string.Empty);        // Assert        Assert.AreEqual(expectedLevel, actualLevel);    }}另一個技巧是將 LogManager 初始化為我的 TestClass 中的私有全局變量,但是如果單元測試異步運行,這可能會產生競爭條件,因為多個方法將訪問相同的輸出變量,這些變量可能會相互覆蓋。是否可以以任何方式對單身人士進行 UnitTest?該設計不允許我重構 LogManager,并從中刪除單例模式。
查看完整描述

1 回答

?
精慕HU

TA貢獻1845條經驗 獲得超8個贊

可以對單例進行單元測試,您只需要換個角度思考即可。不要那么努力地改變你的方法來適應測試??紤]創建一個僅用于測試的方法,LogManager.Uninitialize(). 在這組測試中的每個測試之后調用它以確保您的單例設置回可測試狀態。


[TestCleanup()]

public void Cleanup()

{

     LogManager.Uninitialize();

}

它可能不純粹,但我認為每隔一段時間編寫一次診斷方法就可以了。在需要良好測試覆蓋率的情況下,這比擁有糟糕的測試覆蓋率要好。


查看完整回答
反對 回復 2021-06-26
  • 1 回答
  • 0 關注
  • 168 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號