2009-09-11 13 views
6

En mi aplicación, tengo dos equivalentes enum s. Uno vive en el DAL, el otro en la capa de contrato de servicio. Tienen el mismo nombre (pero están en diferentes espacios de nombres) y deben tener los mismos miembros y valores.Comparando dos tipos * de enum para la equivalencia?

Me gustaría escribir una prueba de unidad que haga cumplir esto. Hasta el momento, tengo la siguiente:

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

Esto funciona bien para comparar los nombres, pero ¿cómo puedo comprobar que los valores coinciden, así?

(estoy usando NUnit 2.4.6, pero esta cifra se aplica a cualquier marco de prueba de unidad)

Respuesta

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

Ah, probé Assert.AreEqual ((int) xValues ​​[i], (int) yValues ​​[i]) y no estaba teniendo nada de eso. –

1

Me gustaría darle la vuelta al modo de comprobar alrededor. Es más fácil obtener un nombre de un valor en lugar de un valor de un nombre. Iteramos los valores y verificamos los nombres al mismo tiempo.

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

Suponiendo que está probando la equivalencia int y la equivalencia de cadenas de dos enumeraciones diferentes, le falta un elenco: Assert.AreEqual (xValue, yValue); debería ser probablemente Assert.AreEqual ((int) xValue, (int) yValue) ;. En ese caso, esta es una verificación más completa que la respuesta elegida. – andes

+1

Esta respuesta es correcta, pero también debe cambiar la x, y como segunda pasada para que pueda verificarla en ambos sentidos. De lo contrario, podría tener más en el tipo y que no están en el tipo x. –

Cuestiones relacionadas