Краткий ответ, да, вы можете. Более длинный ответ будет зависеть от множества факторов, влияющих на то, как он будет работать в вашем наборе тестов.
В основном вы можете сделать что-то вроде этого:
public void GenericIFooTest(IFoo testFoo) {
// each of your tests against foo here...
Assert.IsTrue(testFoo.DoesItsThing());
}
Затем вы можете сгенерировать свои тесты вручную:
public void TestConcreteAFoo() {
IFoo aFoo = new ConcreteAFoo(param1, param2, param3);
GenericIFooTest(aFoo);
}
public void TestConcreteBFoo() {
IFoo bFoo = new ConcreteBFoo();
GenericIFooTest(bFoo);
}
Или вы можете использовать отражение, чтобы сделать это. Это предполагает, что вы знаете, как создавать экземпляры каждого foo динамически, если у него есть конструктор по умолчанию, который был бы наилучшим:
public void TestAllFoos() {
foreach(string assembly in Directory.GetFiles(assemblyPath, "*.dll", SearchOptions.All) {
Assembly currentAssembly = Assembly.LoadAssembly(assembly);
foreach(Type internalTypes in currentAssembly.GetTypes()) {
if (internalTypes.IsAssignableFrom(IFoo) && !(internalTypes is IFoo)) {
IFoo fooType = AppActivator.CreateInstance(internalTypes);
GenericIFooTest(fooType);
}
}
}
}
Последняя часть из памяти какого-то кода, который я писал на прошлой неделе, чтобы сделать то же самое, немного грубовато, но вам нужно начать. Конечно, вы могли бы использовать LINQ, чтобы упростить его, я просто не знаю синтаксис на макушке.