Cześć,
Piszę testy jednostkowe to pewnej mojej biblioteki z wykrzystaniem NUnint 2.5.9 (testy dla .net).
W dll-ce mam spory zestaw klas (których systematycznie przybywa), które zawsze mają spełniać pewien zestaw założeń.
Oczywiście mógłbym to zrobić tak:
[TestCase("ClassName1")]
[TestCase("ClassName2")]
[TestCase("ClassName3")]
[TestCase("ClassName4")]
[TestCase("ClassName5")]
....
void testCaseName(string className)
{
....
}
Ale jest to głupie rozwiązanie i wymaga ciągłego uzupełniania listy TestCase, a ta lista jest dość długa (finalnie będzie powyżej 100).
Jestem w stanie automatycznie pobrać pełną listę klas spełniającą założenia korzystając z meta danych:
using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
using NUnit.Framework;
....
private static List<Type> findAllClassesToTest()
{
Assembly dll = typeof(NameOfSomClass).Assembly;
List<Type> exported = dll.GetExportedTypes().ToList().FindAll(
delegate(Type export)
{
return export.IsClass
&& !export.IsAbstract
&& export.IsSubclassOf(typeof(SomeBaseClass))
&& export.GetConstructor(Type.EmptyTypes) != null;
});
return exported;
}
Ale teraz jak tą listę wykorzystać tak by każdy element tej listy stanowił jeden TestCase?
Nie mogę po prostu iterować po wszystkich w jednym teście, bo efekt będzie taki, że jeden fail zatrzyma dalszą analizę dla pozostałych klas, a ja chcę, by zawsze przetestowane zostały wszystkie klasy i dla każdej z nich został pokazany wynik testu (tak jak w przypadku wypisanej explicite pełnej listy klas z użyciem [TestCase("NazwaKlasy")] - jak w pierwszym przykładzie kodu).
Jakieś sugestie?