Общий репозиторий Moq — GetById(int i) возвращает T

У меня есть общий репозиторий, и я пытаюсь создать реализацию 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 where.

List<T> list

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


person ministrymason    schedule 30.12.2011    source источник


Ответы (1)


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

Если вы хотите, чтобы вспомогательный метод создавал репозиторий для любого типа сущности, это выполнимо. Вы должны либо реализовать интерфейс для сущностей, чтобы получить идентификатор, либо передать делегат вспомогательному методу. Ниже приведен пример 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 не работает. ;)

person TrueWill    schedule 30.12.2011