Visual Studio 2008: методы модульного тестирования в общих классах не обнаружены должным образом - PullRequest
2 голосов
/ 17 сентября 2010

У меня есть куча классов репозитория, которые я хочу протестировать с использованием Visual Studio 2008. Они реализуют следующий интерфейс:

public interface IRepository<TEntity> where TEntity : IEntity
{
    /// <summary>
    /// Get entity by ID
    /// </summary>
    /// <param name="id">The ID</param>
    /// <returns></returns>
    TEntity GetById(int id);

    /// <summary>
    /// Get all entities
    /// </summary>
    /// <returns></returns>
    IEnumerable<TEntity> GetAll();
}

Теперь я могу написать полноценный тестовый класс для каждого репозитория, который у меня есть. Однако, чтобы минимизировать избыточность, я хочу написать базовый тестовый класс, который содержит основные «общие» тестовые методы. Это позволило бы мне написать простой подкласс для каждого репозитория, например:

[TestClass]
public class EmployeeRepositoryTest : RepositoryTestBase<Employee>
{
     // all test methods are inherited from the base class
     // additional tests could be added here...
}

Однако методы тестирования, определенные в RepositoryTestBase, не обнаруживаются Visual Studio (из-за обобщений), что делает этот подход бесполезным. Чтобы это работало, мне нужно было обернуть каждый метод базового класса, чтобы сделать их видимыми для Visual Studio, что снова вызывает избыточность ..

Есть ли лучший подход для решения этой боли? Я не хочу загромождать свои тесты тоннами упаковочного кода: (

1 Ответ

2 голосов
/ 17 сентября 2010

Можно ли не иметь обобщений в объявлении тестирования, вместо этого полагаться только на IEntity, например:

IEntity GetById(int id);
IEnumerable<IEntity> GetAll();

И если этим двум функциям необходимо выполнить какие-либо экземпляры IEntity, у вас может быть хранилищеконструктор принимает фабричный объект.Это была бы работа фабричного объекта, чтобы сделать экземпляр.Была бы абстрактная база (или интерфейс) для фабрики, метод создания которой просто возвращает IEntity, и дочерние классы, которые могут или не могут быть шаблонизированы.

...