通用Moq存储库 - GetById(int i)返回T.

时间:2011-12-30 11:43:23

标签: generics moq

我有一个通用存储库,我试图为我的单元测试创​​建一个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

任何人都可以帮我转换上述方法。

1 个答案:

答案 0 :(得分:3)

我不完全确定你在问什么。如果您只想创建通用存储库的模拟,则设置是相同的。

如果您希望帮助方法为任何实体类型创建存储库,那是可行的。您必须在实体上实现接口以检索ID或将委托传递给辅助方法。这是一个显示第一种技术的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);
}

顺便说一句,假设您的ID始终是整数是有风险的。您可以考虑在整个代码库中使int类型为通用(用于指代ID /主键)。通常我会调用YAGNI,但使用int搜索和替换Guid效果不佳。 ;)