2011-01-10 8 views
7

Come verificare la presenza di attributi di classe e attributi di metodo con MsTest utilizzando C#?Come analizzare gli attributi del test con MsTest usando C#?

+1

Questo mi sembra eccessivo. Puoi semplicemente ispezionare il codice sorgente. – jason

+3

In realtà questo tipo di cose è abbastanza buono per catturare errori di refactoring. È anche importante assicurarsi che il codice che si basa sugli attributi sia ben testato (e fornisca messaggi di errore decenti). –

+0

ed è richiesto da TDD –

risposta

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

spot on e può essere integrato nella mia risposta sopra. Potrei farlo. Molto più elegante. – dove

+0

mente se io combino idea nella mia risposta? – dove

+0

@dove: certo, ci sono. –

4

Utilizzare la riflessione, ad esempio, ecco uno in nunit + C#, che può essere facilmente adattato 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 po 'di lavoro, scommetto che potresti rendere 'IsTypeSerializable' un metodo generico in grado di gestire qualsiasi attributo. –

+0

@Robert, assolutamente, potrebbe anche essere letto meglio come un'estensione su System.Type, che potrei includere per il diavolo di esso – dove

+0

@Robert, aveva un piccolo giocattolo con quello ed è abbastanza fattibile, ma penso che sarebbe solo una risposta ingombrante sopra. La mia risposta è stata risolta con i test in mente, avendo scritto i tipi di errore sulla console. Il metodo di estensione potrebbe avere una firma come: public static bool IsTypeSerializeable (questo tipo di System.Type, System.Type checkType) // anche se potresti voler avere solo un attributo come secondo parametro, ha bisogno di un po 'più di lavoro che vorrei fare solo se è stato richiesto. ok, lo inserisco;) – dove

1

Scrivi soli due funzioni di supporto (con riflessione) lungo queste linee:

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

Quindi è possibile scrivere i test in questo modo:

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

In questo modo non è necessario usa if/else/foreach o altra logica nei tuoi metodi di test. In questo modo diventano molto più chiari e leggibili.

HTH
Thomas

+0

si ha un punto ma il mio test (e altri non l'ho inserito qui) è che con una corsa di test si ottiene l'entità non riuscita emessa in console , salvando più ripetizioni di test per ogni entità in errore, come Robert ha dato, ci sono ancora modi più eleganti. – dove