2011-12-30 89 views
3

我有一个通用的存储库,并试图为我的单元测试创​​建一个moq实现。我需要创建一个GetById方法。这是我决定将其转换为泛型之前的moq实现。通用Moq存储库 - GetById(int i)返回T

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 

谁能帮助我转换方法。

回答

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,但搜索和替换intGuid不能正常工作。 ;)