2011-07-06 34 views

回答

4

您的POCO是否會以適當方式覆蓋Equals?如果不是,那就是問題所在。覆蓋EqualsGetHashCode,你應該沒問題。

這是假設您只需要覆蓋一個平等的概念。另一種方法是在另一個類中實現IEqualityComparer<T>,並使用它。 (我不知道是否可選IEqualityComparer<T>參數,但您可以隨時調用它。)

2

您可以查看expected objects library。它非常整齊,並且在幕後爲您處理所有的比較邏輯,使您的代碼變得更輕鬆,更輕鬆。你甚至可以告訴它忽略類型,所以如果你想檢查一個對象的幾個屬性,你可以將它與一個對象或任何對象進行比較。

+0

雖然這可能是一種選擇,但我會對此保持警惕,因爲它可能會導致您相信您的對象是平等的,但當在框架中使用許多方法和類時不會這樣考慮它們。即一個對象不會被認爲是集合的一部分,因爲這會使用Equals來執行該檢查。我不認爲這會解決OP對Assert.AreEqual的使用嗎?他將不得不使用ExpectedObject上的斷言。除非我誤解了一些東西...... –

+0

@sam,不知道你的意思。這個預期的對象庫不是用於生產代碼,而是僅用於單元測試,所以他們的真實世界的平等不是重點,它的用途是檢查你從測試中收到的對象是否是你期望的。你是否期望所有的領域都是平等的,或者只關心一些領域是否取決於你。我只是看不到像poco這樣簡單的東西,代碼的唯一目的就是檢查測試中對象的平等性。 –

+0

如果OP使用'Assert.Equal'來檢查他創建的兩個對象是否確實相等,這與驗證該對象是否與您期望的完全不同。預期的對象可能有助於簡化測試,但如果測試的**點**是創建2個具有相同值的對象,然後驗證它們被認爲是彼此相等,則根本無濟於事。如果你正在創建第二個對象來檢查第一個對象的值,那麼我可以看到這個值,但是從OP的問題來看,情況並非如此。我只是想明確這個區別。 –

2

測試失敗,因爲您的對象不相等。他們可能在他們的領域有相同的價值觀,但這並不能使他們平等。默認情況下,如果對象具有相同的地址,並且它們是相同的對象,則它們是相等的。

要獲得您想要的行爲(即您希望具有相同值的屬性的對象相同),您需要覆蓋Equals並定義它使對象相等。如果這是所有屬性,請在此處檢查所有屬性。如果只是一些,那麼只檢查那些。根據你的情況做任何需要做的事來確定平等。

如果您正在覆蓋Equals你也應該覆蓋GetHashCode,並確保當Equals是真實的兩個對象GetHashCode兩個返回相同的值。

相關問題