2009-09-11 95 views
6

在我的申請中,我有兩個等效的enum s。一個住在DAL中,另一個住在服務合同層。它們具有相同的名稱(但位於不同的名稱空間中),並且應具有相同的成員和值。比較兩個枚舉類型*的等價性?

我想編寫一個強制執行此操作的單元測試。到目前爲止,我得到以下幾點:

public static class EnumAssert 
{ 
    public static void AreEquivalent(Type x, Type y) 
    { 
     // Enum.GetNames and Enum.GetValues return arrays sorted by value. 
     string[] xNames = Enum.GetNames(x); 
     string[] yNames = Enum.GetNames(y); 

     Assert.AreEqual(xNames.Length, yNames.Length); 
     for (int i = 0; i < xNames.Length; i++) 
     { 
      Assert.AreEqual(xNames[i], yNames[i]); 
     } 

     // TODO: How to validate that the values match? 
    } 
} 

這對比較名稱很合適,但是如何檢查值是否匹配?

(我使用NUnit 2.4.6,但我想這也適用於任何單元測試框架)

回答

13

Enum.GetValues

var xValues = Enum.GetValues(x); 
var yValues = Enum.GetValues(y); 

for (int i = 0; i < xValues.Length; i++) 
{ 
    Assert.AreEqual((int)xValues.GetValue(i), (int)yValues.GetValue(i)); 
} 
+0

啊,我試過Assert.AreEqual((int)xValues [i],(int)yValues [i]),它沒有它。 – 2009-09-11 10:40:19

1

我會翻轉你檢查周圍的道路。從名稱中獲取名稱而不是名稱中的值更容易。迭代數值並同時檢查名稱。

public static class EnumAssert 
{ 
    public static void AreEquivalent(Type x, Type y) 
    { 
     // Enum.GetNames and Enum.GetValues return arrays sorted by value. 
     var xValues = Enum.GetValues(x); 
     var yValues = Enum.GetValues(y); 

     Assert.AreEqual(xValues.Length, yValues.Length); 
     for (int i = 0; i < xValues.Length; i++) 
     { 
      var xValue = xValues.GetValue(i); 
      var yValue = yValues.GetValue(i); 
      Assert.AreEqual(xValue, yValue); 
      Assert.AreEqual(Enum.GetName(x, xValue), Enum.GetName(y, yValue)); 
     } 
    } 
} 
+0

假設您正在測試兩個不同枚舉的int等價和字符串等價性,則缺少一個強制轉換:Assert.AreEqual(xValue,yValue);應該可能是Assert.AreEqual((int)xValue,(int)yValue);.在這種情況下,這比選擇的答案更徹底。 – andes 2013-03-15 14:24:53

+1

這個答案是正確的,但你也需要將x,y作爲第二遍來切換,這樣你就可以檢查它。否則,你可以在y類型中有不在x類型中的多餘元素。 – 2016-07-29 14:38:57