Универсальный репозиторий Moq - GetById (int i) возвращает T - PullRequest
3 голосов
/ 30 декабря 2011

У меня есть общий репозиторий, и я пытаюсь создать реализацию moq для моих модульных тестов. Мне нужно создать метод GetById. Это реализация moq до того, как я решил преобразовать ее в дженерики.

mockUserRepository.Setup(r => r.GetById(It.IsAny<int>()))
.Returns((int i) => users.Where(u => u.Id == i).Single());

Для настройки MOQ будет использоваться общий репозиторий

Mock<IRepository<T>> mockRepository

Общий список подделок будет использоваться для LINQ, где пункт

List<T> list

Может кто-нибудь помочь мне преобразовать метод выше.

1 Ответ

3 голосов
/ 30 декабря 2011

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

Если вам нужен вспомогательный метод для создания репозитория для любого типа объекта, это выполнимо.Вы должны либо реализовать интерфейс на объектах для получения идентификатора, либо передать делегат вспомогательному методу.Вот пример LINQPad , в котором показан первый метод.

void Main()
{
    var users = new List<User>
        { new User { Id = 1 }, new User { Id = 2 } };

    var mockUserRepository = new Mock<IUserRepository>();

    mockUserRepository.Setup(r => r.GetById(It.IsAny<int>()))
        .Returns((int i) => users.Where(u => u.Id == i).Single());

    mockUserRepository.Object.GetById(2).Dump();

    var mockUserRepository2 = new Mock<IRepository<User>>();

    mockUserRepository2.Setup(r => r.GetById(It.IsAny<int>()))
        .Returns((int i) => users.Where(u => u.Id == i).Single());

    mockUserRepository2.Object.GetById(2).Dump();

    IRepository<User> userRepository3 = CreateTestRepository(users);

    userRepository3.GetById(2).Dump();
}

public static IRepository<TEntity> CreateTestRepository<TEntity>(
    List<TEntity> entities)
    where TEntity: IPrimaryKeyed
{
    var mockRepository = new Mock<IRepository<TEntity>>();

    mockRepository.Setup(r => r.GetById(It.IsAny<int>()))
        .Returns((int i) => entities.Where(e => e.Id == i).Single());

    return mockRepository.Object;
}

public interface IPrimaryKeyed
{
    int Id { get; }
}

public class User : IPrimaryKeyed
{
    public int Id { get; set; }
}

public interface IUserRepository
{
    User GetById(int id);
}

public interface IRepository<T>
{
    T GetById(int id);
}

Кроме того, предполагать, что ваши идентификаторы всегда будут целыми числами, рискованно.Вы можете подумать о том, чтобы сделать тип int универсальным (когда он используется для ссылки на идентификаторы / первичные ключи) во всей базе кода.Обычно я бы вызывал YAGNI , но поиск и замена int на Guid не работает.;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...