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#?
Odpowiedz
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;
}
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
Przy odrobinie pracy, założę się, że można by przekształcić 'IsTypeSerializable' w ogólną metodę, która poradzi sobie z dowolnym atrybutem. –
@Robert, absolutnie, może również lepiej przeczytać jako rozszerzenie w System.Type, które mogę dodać do cholery – dove
@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
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
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
To wydaje się przesadą. Możesz po prostu sprawdzić kod źródłowy. – jason
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). –
i jest to wymagane przez TDD –