我們正在使用Moq 4進行單元測試,尤其是控制器單元測試。我們正在使用Moq的Verify()方法來確保記錄了錯誤。問題在于測試可以通過,但隨后的下一次運行將失敗。我們正在使用Serilog作為記錄器。動作方法看起來像public IActionResult Index(){ try{ var data = _repository.GetData(); return View(data); }catch(Exception e){ Log.Error(e.Message); }}所以單元測試正在使用_mockLogger.Verify(x=> x.Write(LogEventLevel.Error,It.IsAny<string>()));mockLogger 是在測試的構造函數中設置的,例如var _mockLogger = new Mock<Serilog.ILogger>();Log.Logger = _mockLogger.Object;//...并且該存儲庫被模擬為在調用時引發異常。失敗時,我們會收到錯誤消息“ Moq.MoqException預期在Mock上調用至少一次,但從未執行過x=>x.Write(LogEventLevel.Error,It.IsAny<string>())”有任何想法嗎?
1 回答

慕桂英546537
TA貢獻1848條經驗 獲得超10個贊
不可能完全從發布的代碼中看到問題所在。而且,我感謝為此制作MCVE會有多艱巨。因此,我將進行兩個猜測。
猜測1:我懷疑是您的問題的起因是static
在代碼中使用s,特別是與記錄器有關。
我懷疑正在發生的事情是其他測試(未在帖子中顯示)也在修改/定義記錄器的行為,并且由于記錄器是靜態的,因此這些測試相互干擾。
嘗試重新設計代碼,以便使用serilog的ILogger接口將日志記錄功能的實例依賴注入到測試中的類中,并將其存儲在只讀字段中,并在需要記錄時使用。
猜想2:根據帖子中“在測試的構造函數中設置...”這一部分,您尚未說出(或標記)您正在使用的測試框架。但是我用過的少數工具希望您在屬性方法中而不是在測試的構造函數中執行這種操作。例如,NUnit具有OneTimeSetUp(在運行該類中的任何測試之前),SetUp(在運行該類中的每個測試之前),TearDown(在運行該類中的每個測試之后),OneTimeTearDown(在所有測試之后)在該類中運行)。測試的構造函數可能會以您不期望的順序被調用,并且測試框架不支持該順序。而屬性方法的順序由框架保證。
- 1 回答
- 0 關注
- 460 瀏覽
添加回答
舉報
0/150
提交
取消