Как абстрагировать Linq2SQL для тестируемости - PullRequest
0 голосов
/ 31 марта 2012

Я работаю над проектом, который использует Linq2SQL для доступа к данным. Проект состоит из приложения ASP.NET MVC и 8 библиотек классов. Большинство библиотек классов имеют свои собственные классы данных L2S.

В качестве части работы, которую я делаю, я пытаюсь заставить различные тестируемые компоненты вводить некоторую стабильность, чтобы очистить кодовую базу, в настоящее время интенсивно используются статические классы и методы, а контроллеры имеют статические DataContexts. которые используются во всем.

Как я могу реорганизовать использование L2S, чтобы я мог проверить действия контроллера?

Я ввел инъекцию зависимостей в приложение, чтобы отделить некоторые другие сервисы, но я не хочу, чтобы DataContext являлся свойством зависимостей контроллеров, потому что я хочу управлять созданием экземпляров DataContexts и их DataLoadOptions.

Одна вещь, которую я попробовал, заключалась в том, чтобы воспользоваться преимуществами частичных классов, которые генерирует L2S, и добавить интерфейс к DataContexts, но я обнаружил, что абстракция направлена ​​вверх, в приложение, а не в библиотеки классов. Это не было похоже на правильный способ делать вещи, и это было бы трудно поддерживать. Кто-нибудь имел какой-либо конкретный успех или неудачу с этим методом?

Ответы [ 2 ]

3 голосов
/ 31 марта 2012

Я использую шаблон репозитория, чтобы скрыть DataContext внутри. Репозитории - это абстракции, поэтому они действительно хороши с принципом Dependency Injection.

Например, вы определяете некоторый репозиторий.

public interface IUserRepository
{
    User Get(int id);
    User Save(User user);
    void Delete(User user);
}

Реализация похожа на

public class UserRepository : IUserRepository
{
    private MyDataContext _context;

    UserRepository() 
    {
        _context = new MyDataContext();
    }

   // ...

}

Теперь контроллер зависит только от интерфейса.

public UserController : Controller
{
    UserController(IUserRepository userRepository) { }
}

Итак, он отлично тестируется, так как вы можете высмеивать IUserRepository в своих тестах.

1 голос
/ 01 апреля 2012

В то время как эта статья относится к тестируемости использования структуры сущностей, здесь может применяться концепция высокого уровня.

Суть примеров изложена с использованием шаблона «Единица работы» с шаблоном «Хранилище». Единица работы - это абстракция вокруг контекста данных, представляющая рабочий набор для конкретного контроллера или набор аналогичных контроллеров. В устройство можно включить несколько репозиториев, и, поскольку репозитории основаны на IEnumerable или IQueryable, вы все равно можете воспользоваться преимуществами функции LINQ.

Опции тестируемости включают макетирование модуля и репозиториев или создание представлений в памяти для целей тестирования.

...