簡體   English   中英

為什么使用Moq的Verify()進行不確定的單元測試?

[英]Why are my unit tests using Moq's Verify() non-deterministic?

我們正在使用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>())

有任何想法嗎?

不可能完全從發布的代碼中看到問題所在。 而且,我很高興為此制作MCVE會非常困難。 因此,我將進行兩個猜測。

猜測1:我懷疑是您的問題的起因是在代碼中使用static ,特別是與記錄器有關。

我懷疑正在發生的事情是其他測試(未在帖子中顯示)也在修改/定義記錄器的行為,並且由於記錄器是靜態的,因此這些測試相互干擾。

嘗試重新設計代碼,以便使用serilog的ILogger接口將日志記錄功能的實例依賴項注入到測試中的類中,並將其存儲在只讀字段中,並在需要記錄時使用。

猜想2:根據帖子的“在測試的構造函數中設置...”這一部分,您尚未說出(或標記)您正在使用的測試框架。 但是我使用過的少數工具希望您在屬性方法中而不是在測試的構造函數中執行這種操作。 例如,NUnit具有OneTimeSetUp(在運行該類中的任何測試之前),SetUp(在運行該類中的每個測試之前),TearDown(在運行該類中的每個測試之后),OneTimeTearDown(在所有測試之后)在該類中運行)。 測試的構造函數可能以您不期望的順序被調用,並且測試框架不支持該順序。 而屬性方法的順序由框架保證。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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