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#?
risposta
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;
}
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
Con un po 'di lavoro, scommetto che potresti rendere 'IsTypeSerializable' un metodo generico in grado di gestire qualsiasi attributo. –
@Robert, assolutamente, potrebbe anche essere letto meglio come un'estensione su System.Type, che potrei includere per il diavolo di esso – dove
@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
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
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
Questo mi sembra eccessivo. Puoi semplicemente ispezionare il codice sorgente. – jason
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). –
ed è richiesto da TDD –