簡體   English   中英

測試ClassA中的方法是否已從ClassA中的另一個方法調用

[英]Test if method in ClassA has been called from another method in ClassA

可以測試是否已使用Moq和依賴注入調用方法。 但是,是否可以測試類中的一個方法是否在同一個類中調用另一個方法?

例如,我想測試一下,如果我記錄某個異常,那么也會記錄一條信息消息。

方法是:

public void Error(string message, Exception exception, long logId = 0)
{
    var int32 = (int)logId;
    Info("Id was converted to an int so that it would fit in the log: " + logId, int32);
    Error(message, exception, int32);
}

這是我嘗試進行單元測試。 測試失敗了,有什么辦法可以做到嗎?

void logging_an_error_with_a_long_id_also_logs_info()
{
    var mock = new Mock<ILogger>();
    var testedClass = new Logger();
    var counter = 0;

    testedClass.Error("test" + counter++, new Exception("test" + counter), Int64.MaxValue);

    mock.Verify(m => m.Info(It.IsAny<string>(), It.IsAny<int>()));
}

由於InfoError方法屬於同一個類(ClassA),我不相信我可以將ClassA作為依賴項傳遞給ClassA。 那么它不需要測試嗎?

你能做的最好的事情就是讓Info virtual 這將允許您創建Mock<Logger> ,設置CallBase = true ,並驗證是否已調用Info

var mock = new Mock<Logger> 
{
    CallBase = true
};

mock.Object.Error("test" + counter++, new Exception("test" + counter), Int64.MaxValue);

mock.Verify(m => m.Info(It.IsAny<string>(), It.IsAny<int>()));

這樣,您仍然調用Error的實際實現,但是您已經使用Moq來驗證調用了Info方法。

感覺你正試圖測試錯誤的東西。 Error方法調用類上的Info方法並不重要,重要的是Info方法的行為發生。 它是如何發生的是該類的實現細節。

如果我有一個包含兩個函數的數學類:

public int Mult(int x, int y) {
    return x*y;
}

public int Sqr(int x) {
    return Mult(x,y);
}

我不會測試調用Sqr調用Mult函數,我會測試Sqr(4)==16 如果計算發生在Sqr方法或類的另一個方法中,則無關緊要。

雖然@ Andrew的解決方案可能就是你所追求的,但是嘲笑你正在測試的課程往往導致緊密耦合的脆弱測試。

如果通過觀察它的副作用來測試調用是不切實際的,那么它可能表明實現可能會使用一些重構。

暫無
暫無

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

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