2011-01-10 17 views
7

Cómo probar la presencia de Atributos de Clase y Atributos de Método con MsTest usando C#?Cómo probar atributos de la unidad con MsTest usando C#?

+1

Esto parece un exceso. Puedes simplemente inspeccionar el código fuente. – jason

+3

En realidad este tipo de cosas es bastante bueno para atrapar errores de refactorización. Asegurarse de que el código que se basa en los atributos está bien probado (y da mensajes de error decentes) también es importante. –

+0

y es requerido por TDD –

Respuesta

8

C# Extension method for checking attributes

public static bool HasAttribute<TAttribute>(this MemberInfo member) 
    where TAttribute : Attribute 
{ 
    var attributes = 
     member.GetCustomAttributes(typeof(TAttribute), true); 

    return attributes.Length > 0; 
} 
+0

y puede complementarse en mi respuesta anterior. Podría hacer esto. Mucho más elegante. – dove

+0

¿Te importa si combino la idea en mi respuesta? – dove

+0

@dove: Claro, hazlo. –

4

Utilice la reflexión, por ejemplo aquí hay una en nunit + C#, que se puede adaptar fácilmente a MsTest.

[Test] 
public void AllOurPocosNeedToBeSerializable() 
{ 
    Assembly assembly = Assembly.GetAssembly(typeof (PutInPocoElementHere)); 
    int failingTypes = 0; 
    foreach (var type in assembly.GetTypes()) 
    { 
    if(type.IsSubclassOf(typeof(Entity))) 
    { 
     if (!(type.HasAttribute<SerializableAttribute>())) failingTypes++; 
     Console.WriteLine(type.Name); 
     //whole test would be more concise with an assert within loop but my way 
     //you get all failing types printed with one run of the test. 
    } 
    } 
    Assert.That(failingTypes, Is.EqualTo(0), string.Format("Look at console output 
    for other types that need to be serializable. {0} in total ", failingTypes)); 
} 

//refer to Robert's answer below for improved attribute check, HasAttribute 
+0

Con un poco de trabajo, apuesto a que podría hacer que 'IsTypeSerializable' sea un método genérico que pueda manejar cualquier atributo. –

+0

@Robert, definitivamente, también podría mejorar la lectura como una extensión en System.Type, que puedo incluir por el simple hecho de hacerlo – dove

+0

@Robert, tenía un pequeño juguete con eso y es bastante factible, pero creo que solo sería una respuesta desordenada encima. Mi respuesta está muy determinada con las pruebas en mente, escribiendo los tipos que fallan en la consola. El método de extensión podría tener una firma como: public static bool IsTypeSerializeable (este System.Type tipo, System.Type checkType) // aunque es posible que desee tener un atributo como segundo parámetro, necesita un poco más de trabajo que yo solo hazlo si fue necesario. está bien, lo pondré;) – dove

1

escribe usted mismo dos funciones de ayuda (mediante reflexión) a lo largo de estas líneas:

public static bool HasAttribute(TypeInfo info, Type attributeType) 
public static bool HasAttribute(TypeInfo info, string methodName, Type attributeType) 

entonces usted puede escribir pruebas de la siguiente manera:

Assert.IsTrue(HasAttribute(myType, expectedAttribute)); 

De esta manera no es necesario use if/else/foreach u otra lógica en sus métodos de prueba. Por lo tanto, se vuelven mucho más claros y legibles.

HTH
Thomas

+0

tiene un punto, pero mi prueba (y otras que no he puesto aquí) es que con una ejecución de prueba obtiene todas las entidades defectuosas entregadas a la consola , guardando múltiples repeticiones de prueba para cada entidad que falla, como Robert ha dado, todavía hay formas más elegantes. – dove

Cuestiones relacionadas