Dot-Net

單元測試 Assert.AreEqual 失敗

  • July 11, 2011

我對從集合中獲取對象的方法進行了單元測試。這一直失敗,我不明白為什麼,所以我在下面創建了一個非常簡單的測試來創建 2 個供應商對象並測試它們是否相等,看看我是否可以在我的程式碼測試中發現問題。但是這個測試又失敗了。任何人都可以看到或解釋原因嗎?

   [TestMethod()]
   public void GetSupplierTest2()
   {
       Supplier expected = new Supplier();
       expected.SupplierID = 32532;
       expected.SupplierName = "Test 1"

       Supplier actual = new Supplier();
       actual.SupplierID = 32532;
       actual.SupplierName = "Test 1"

       Assert.AreEqual(expected, actual);
   }

但是,如果我測試測試通過的對象的各個屬性…

   [TestMethod()]
   public void GetSupplierTest2()
   {
       Supplier expected = new Supplier();
       expected.SupplierID = 32532;
       expected.SupplierName = "Test 1"

   Supplier actual = new Supplier();
       actual.SupplierID = 32532;
       actual.SupplierName = "Test 1"

       Assert.AreEqual(expected.SupplierID , actual.SupplierID );
       Assert.AreEqual(expected.SupplierName , actual.SupplierName );
   }

如果要比較 Supplier 的兩個不同實例,並希望在某些屬性具有相同值時將它們視為相等,則必須重寫Equals方法Supplier並在方法中比較這些屬性。

您可以在此處閱讀有關 Equals 方法的更多資訊:http: //msdn.microsoft.com/en-us/library/bsc2ak47.aspx

範例實現:

public override bool Equals(object obj)
{
   if (obj is Supplier)
   {
       Supplier other = (Supplier) obj;
       return Equals(other.SupplierID, this.SupplierID) && Equals(other.SupplierName, this.SupplierName);
   }
   return false;
}

請注意,您還會收到一個編譯器警告,提示您還必須實現 GetHashCode,這可能很簡單:

public override int GetHashCode()
{
   return SupplierID;
}

正如所有其他答案所說,問題是您正在嘗試比較Supplier

$$ probably $$沒有覆蓋Equals方法。但我認為您不應該Equals出於測試目的而覆蓋,因為它可能會影響生產程式碼,或者您可能需要Equals生產程式碼中的其他邏輯。 相反,您應該像在第一個範例中那樣逐個聲明每個成員(如果您沒有很多地方要比較整個對象),或者將此比較邏輯封裝在某個類中並使用此類:

static class SupplierAllFieldsComparer
{
   public static void AssertAreEqual(Supplier expected, Supplier actual)
   {
       Assert.AreEqual(expected.SupplierID , actual.SupplierID );
       Assert.AreEqual(expected.SupplierName , actual.SupplierName );            
   }
}

// 測試程式碼:

SupplierAllFieldsComparer.AssertAreEqual(expected, actual);

引用自:https://stackoverflow.com/questions/6328218