Я думаю, я знаю, что вы имеете в виду. У меня была такая же проблема.
Моим решением было создать иерархию также для тестирования. Я буду использовать тот же пример, что вы показываете.
Сначала создайте абстрактный тестовый класс для базового IEmployee.
У него есть две основные вещи:
я. Все методы испытаний, которые вы хотите.
II. Абстрактный метод, который возвращает желаемый экземпляр IEmployee.
[TestClass()]
public abstract class IEmployeeTests
{
protected abstract GetIEmployeeInstance();
[TestMethod()]
public void TestMethod1()
{
IEmployee target = GetIEmployeeInstance();
// do your IEmployee test here
}
}
Во-вторых, у вас есть тестовый класс для каждой реализации IEmployee, реализующий абстрактный метод и предоставляющий соответствующие экземпляры IEmployee.
[TestClass()]
public class WorkerTests : IEmployeeTests
{
protected override GetIEmployeeInstance()
{
return new Worker();
}
}
[TestClass()]
public class ManagerTests : IEmployeeTests
{
protected override GetIEmployeeInstance()
{
return new Manager();
}
}
Вы можете видеть, что все работает, как ожидалось, и VS предоставляет ожидаемые методы тестирования для каждого класса WorkerTests и ManagerTests в окне TestView.
Вы можете запустить их и получить результаты тестов для каждой реализации интерфейса IEmployee, создавая тесты только в базовом классе IEmployeeTests.
Вы всегда можете добавить специальный тест для производных классов WorkerTests и ManagerTests.
Теперь возникает вопрос: а как насчет классов, которые реализуют несколько интерфейсов, скажем, EmployedProgrammer?
public EmployedProgrammer : IEmployee, IProgrammer
{
}
У нас нет множественного наследования в C #, поэтому это не вариант:
[TestClass()]
public EmployedProgrammerIEmployeeTests : IEmployeeTests, IProgrammerTests
{
// this doesn't compile as IEmployeeTests, IProgrammerTests are classes, not interfaces
}
Для этого сценария решение состоит в том, чтобы иметь следующие тестовые классы:
[TestClass()]
public EmployedProgrammerIEmployeeTests : IEmployeeTests
{
protected override GetIEmployeeInstance()
{
return new EmployedProgrammer();
}
}
[TestClass()]
public EmployedProgrammerIProgrammerTests : IProgrammerTests
{
protected override GetIProgrammerInstance()
{
return new EmployedProgrammer();
}
}
с
[TestClass()]
public abstract class IProgrammerTests
{
protected abstract GetIProgrammerInstance();
[TestMethod()]
public void TestMethod1()
{
IProgrammer target = GetIProgrammerInstance();
// do your IProgrammerTest test here
}
}
Я использую это с хорошими результатами.
Надеюсь, это поможет.
С уважением,
Хосе