2013-06-20 54 views
4

我正在爲我寫的一些.net代碼編寫單元測試。Assert.AreEqual如何比較.net單元測試中的兩個對象?

我熟悉這樣寫代碼:

int expected = 10; 
int actual = multiplyByTwo(5); 
Assert.AreEqual(expected, actual); 

,該參數都是整數的情況下,很顯然期望的代碼做什麼。

當傳入的參數是對象時代碼會做什麼?

如果我寫了一個名爲MyClass的自定義類別,如何控制Assert.AreEqual何時合格,並且使用MyClass類型的對象失敗?

回答

4

official documentation很漂亮,並沒有解釋它,所以我相信如果對象不是原始的,那麼他們的引用將被比較。

也就是說,對同一對象的兩個引用將評估爲相等;同一對象的兩個克隆將評估爲不同。除非你超載這些對象所屬的類的實例方法,或者所述類的==運算符。

另請參閱Reed Copsey的答案。

+1

看來,超載'Equals'奏效了我。 –

3

當傳入的參數是對象時代碼會做什麼?

在這種情況下,事實並非如此。它叫Assert.AreEqual<int>(expected, actual);

Assert.AreEqual方法有many overloads。在這種情況下,兩個Int32值的最佳匹配是generic overload。由於這是「最佳匹配」,編譯器會選擇這種超載。

它,在內部,將與由整數工作:

驗證兩個指定的泛型類型的數據是通過使用等於運算符相同。

關於你問題的第二部分:

如果我寫歸類定製名爲MyClass的,我怎麼能控制何時Assert.AreEqual通過與MyClass類型的對象失敗了嗎?

Assert.AreEqual使用equality operator (==)來測試,如上所述。

0

如果對象是可序列化的,您可以序列化它們,然後比較序列化的版本。

您可以使用此XmlSerialize擴展方法來處理序列化。

例如,當一個類Cat的比較的情況下,下面的僞代碼演示了這種

var expected = GetExpectedInstance(); // returns the expected result 
var actual = CallMethodUnderTest(); // get the actual result 

var e = expected.XmlSerialize<Cat>(); 
var a = actual.XmlSerialize<Cat>(); 

Assert.AreEqual(e, a);