2009-09-11 9 views
6

私のアプリケーションでは、私は2つの同等のenumを持っています。 1人はDALに、もう1人はサービス契約層に存在します。彼らは同じ名前を持っています(しかし、異なる名前空間にあります)。同じメンバーと値を持つ必要があります。2つの列挙型*の等価性の比較?

これを実施するユニットテストを作成したいと思います。これまでのところ、私は次のよう持っている:

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? 
    } 
} 

これは名前を比較するため正常に動作しますが、どのように私は値が同様に一致していることをチェックしますか?

答えて

13

Enum.GetValuesを(私はNUnitの2.4.6を使用していますが、私は、これは任意のユニットテストフレームワークに適用把握):

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

ああ、私は([I](INT)xValues [i]は、(INT)yValues)Assert.AreEqualを試み、それを全く有していませんでした。 –

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

2つの異なる列挙型のint等価性と文字列等価性をテストしていると仮定すると、キャストが欠落しています:Assert.AreEqual(xValue、yValue);おそらくAssert.AreEqual((int)xValue、(int)yValue);でなければなりません。その場合、これは選択された回答よりも徹底的なチェックです。 – andes

+1

この回答は正しいですが、x、yを2番目のパスに切り替えて両方向にチェックする必要があります。それ以外の場合は、x型以外のy型の余分なものを持つことができます。 –