Есть ли лучший способ инициализировать фиктивный репозиторий с использованием обобщений? - PullRequest
1 голос
/ 14 февраля 2011

Я пытаюсь найти общий способ инициализации фиктивного репозитория для моего тестового класса. Поскольку у меня есть несколько репозиториев, я попытался сделать это с помощью дженериков. У меня есть общий интерфейс хранилища:

public interface IRepository<T> where T: class
{
    IQueryable<T> GetAll();
}

Мой метод статической инициализации выглядит следующим образом:

public static Mock<T> GetRepository<T, TK>(params TK[] items) where T: class, IRepository<TK> where TK: class 
{
    Mock<T> mock = new Mock<T>();
    mock.Setup(m => m.GetAll()).Returns(items.ToList().AsQueryable);
    return mock;
} 

Для инициализации моего хранилища в коде я использую:

Mock<IRepository<Link>> linkRepository = UnitTestHelpers.GetRepository<IRepository<Link>, Link>(new[] { 
   new Link { LinkId = 1, Title = "Title 1", Created = DateTime.Now, Url = "http://google.com" }, 
   new Link { LinkId = 1, Title = "Title 2", Created = DateTime.Now, Url = "http://google.com" }, 
   new Link { LinkId = 1, Title = "Title 3", Created = DateTime.Now, Url = "http://google.com" } 
});

Я чувствую, что это не самый элегантный способ сделать это, поскольку мне нужно дважды указать Link в методе GetRepository. Есть ли более приятный / чистый способ сделать это?

1 Ответ

1 голос
/ 20 февраля 2011

Да, есть несколько более плавный способ добиться этого. Как вы упоминаете, параметр типа Link является избыточным, это потому, что нет никакой реальной необходимости параметризовывать общий тип IRepository<T>. Попробуйте это

public static Mock<IRepository<T>> GetRepository<T>(params T[] items) where T: class {
    Mock<IRepository<T>> mock = new Mock<IRepository<T>>();
    mock.Setup(m => m.GetAll()).Returns(items.ToList().AsQueryable);
    return mock;
}

Некоторые несвязанные намеки:

  • Откажитесь от вызова ToList(), если на самом деле необходимо. Добавляет лень и улучшенную читаемость.
  • Используйте определенный DateTime вместо DateTime.Now для создания повторяемого модульного теста.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...