我有一个通用存储库,我试图为我的单元测试创建一个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
任何人都可以帮我转换上述方法。
答案 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
效果不佳。 ;)