在Microsoft.VisualStudio.TestTools.UnitTesting
命名空間中,有便利的靜態類Assert
來處理測試中正在進行的斷言。Microsoft.VisualStudio.TestTools.UnitTesting.Assert通用方法重載行爲
讓我感到困惑的是大多數方法都極其重載,最重要的是,它們有一個通用版本。一個具體的例子是Assert.AreEqual
其中有18個重載,其中:
Assert.AreEqual<T>(T t1, T t2)
什麼用這種泛型方法嗎?最初,我認爲這是一種直接調用IEquatable<T> Equals(T t)
方法的方法,但事實並非如此;它總是會調用非通用版本object.Equals(object other)
。在編寫了相當多的單元測試之後,我發現了這個難題,而不是像預期的那樣事先檢查類的定義。
爲了調用Equals
的通用版本,被定義的一般方法將不得不爲:
Assert.AreEqual<T>(T t1, T t2) where T: IEquatable<T>
有一個很好的理由,爲什麼它沒有這樣做呢?
是的,你失去的一般方法爲所有那些沒有實現IEquatable<T>
類型,但無論如何,它不是一個很大的損失,因爲平等將通過object.Equals(object other)
進行檢查,所以Assert.AreEqual(object o1, object o2)
已經足夠好了。
目前的通用方法是否提供了我不考慮的優點,還是僅僅是因爲沒有人會停下來思考它,因爲這不是什麼大問題?我看到的唯一優勢是參數類型安全,但看起來有點差。
編輯:修正了一個錯誤,我一直在提及IComparable
,我的意思是IEquatable
。
你不能約束它,因爲任何沒有它自己的重載的T自然會解析爲重載解析的一部分,只有這樣編譯器纔會抱怨任何沒有實現接口的T的未實現約束。至於你的錯誤假設,你是否在構建你的測試策略之前檢查了方法的文檔? – 2014-09-03 16:18:22
AnthonyPegram:如果你約束它,你不能傳入任何沒有實現這個接口的T,那麼在運行時如何重載解析失敗呢? – InBetween 2014-09-03 16:38:03
它會在編譯時失敗,但重載解析已經決定了T超載,然後*然後*檢查約束(和失敗)。約束不是簽名的一部分。如果你搜索這個短語,你會發現很多資源(這裏和其他地方,尤其是Eric Lippert的博客),這會給你更多的細節。 – 2014-09-03 16:40:07