我有一個記錄器類,其目的是從我的解決方案中的任何類中調(diào)用,該類決定記錄某些內(nèi)容。我添加了一個接口,這就是為什么我應用了單例模式,并且沒有使用靜態(tài)類。我的 LogManager 實現(xiàn)(單例):https : //pastebin.com/NHKmbj9c我想編寫簡單的單元測試,它應該使用局部變量,測試每個 ILogger 方法的功能,但是一旦我的第一個單元通過,單例將在上下文中保持初始化狀態(tài),使后續(xù)單元測試失敗(而他們正在嘗試初始化單身人士......)。單元測試:[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 中的私有全局變量,但是如果單元測試異步運行,這可能會產(chǎn)生競爭條件,因為多個方法將訪問相同的輸出變量,這些變量可能會相互覆蓋。是否可以以任何方式對單身人士進行 UnitTest?該設計不允許我重構 LogManager,并從中刪除單例模式。
1 回答

精慕HU
TA貢獻1845條經(jīng)驗 獲得超8個贊
可以對單例進行單元測試,您只需要換個角度思考即可。不要那么努力地改變你的方法來適應測試??紤]創(chuàng)建一個僅用于測試的方法,LogManager.Uninitialize(). 在這組測試中的每個測試之后調(diào)用它以確保您的單例設置回可測試狀態(tài)。
[TestCleanup()]
public void Cleanup()
{
LogManager.Uninitialize();
}
它可能不純粹,但我認為每隔一段時間編寫一次診斷方法就可以了。在需要良好測試覆蓋率的情況下,這比擁有糟糕的測試覆蓋率要好。
- 1 回答
- 0 關注
- 146 瀏覽
添加回答
舉報
0/150
提交
取消