![](/img/trans.png)
[英]Calling a ClassA.Method() as ClassB.Method() but only affecting ClassA values, both classes are deriving from the same BaseClass
[英]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>()));
}
由於Info
和Error
方法屬於同一個類(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.