2011-01-10 17 views
7

Jak sprawdzić obecność atrybutów klas i atrybutów metod za pomocą MsTest przy użyciu C#?Jak przeprowadzić testowanie atrybutów za pomocą MsTest przy użyciu C#?

+1

To wydaje się przesadą. Możesz po prostu sprawdzić kod źródłowy. – jason

+3

W rzeczywistości tego typu rzeczy są całkiem dobre do łapania błędów refaktorskich. Ważne jest również sprawdzenie, czy kod oparty na atrybutach jest dobrze przetestowany (i zapewnia przyzwoite komunikaty o błędach). –

+0

i jest to wymagane przez TDD –

Odpowiedz

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

na miejscu i mogą być uzupełnione w mojej odpowiedzi powyżej. Mogę to po prostu zrobić. O wiele bardziej elegancko. – dove

+0

myślisz, czy twoja kombinacja pomysłu w moją odpowiedź? – dove

+0

@dove: Jasne, masz na to. –

4

Użyj refleksji, na przykład tutaj jest jeden w nunit + C#, który można łatwo dostosować do 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

Przy odrobinie pracy, założę się, że można by przekształcić 'IsTypeSerializable' w ogólną metodę, która poradzi sobie z dowolnym atrybutem. –

+0

@Robert, absolutnie, może również lepiej przeczytać jako rozszerzenie w System.Type, które mogę dodać do cholery – dove

+0

@Robert, miał małą zabawkę z tym i jest to całkiem wykonalne, ale myślę, że to tylko bałagan odpowiedzi powyżej. Moja odpowiedź jest bardzo ściśle ustalona z myślą o testowaniu, mając na pamięci błędne typy zapisane na konsoli. Metoda rozszerzenia może mieć sygnaturę: public static bool IsTypeSerializeable (ten typ System.Type, System.Type checkType) // chociaż możesz chcieć mieć atrybut jako drugi parametr, potrzebuje trochę więcej pracy, którą chciałbym robić tylko jeśli było to wymagane. okej, włożę to;) – dove

1

Napisz sobie dwie funkcje pomocnicze (przy użyciu odbicia) wzdłuż tych linii:

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

Następnie można pisać testy tak:

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

W ten sposób nie trzeba użyć, jeśli/else/foreach lub innej logiki w swoich metodach testowych. Dzięki temu stają się o wiele bardziej przejrzyste i czytelne.

HTH
Thomas

+0

Masz punkt, ale mój test (i inne, których tutaj nie umieściłem) polega na tym, że przy jednym uruchomieniu testowym otrzymujesz wszystkie uszkodzone jednostki wyprowadzone na konsolę , oszczędzając wielokrotne powtórzenia testu dla każdego upadającego podmiotu, jak Robert dał, są jeszcze bardziej eleganckie sposoby. – dove

Powiązane problemy