我目前使用的扩展方法一般模拟DbSets作为一个列表:有没有办法一般地用Moq模拟DbSet.Find方法?
public static DbSet<T> AsDbSet<T>(this List<T> sourceList) where T : class
{
var queryable = sourceList.AsQueryable();
var mockDbSet = new Mock<DbSet<T>>();
mockDbSet.As<IQueryable<T>>().Setup(m => m.Provider).Returns(queryable.Provider);
mockDbSet.As<IQueryable<T>>().Setup(m => m.Expression).Returns(queryable.Expression);
mockDbSet.As<IQueryable<T>>().Setup(m => m.ElementType).Returns(queryable.ElementType);
mockDbSet.As<IQueryable<T>>().Setup(m => m.GetEnumerator()).Returns(queryable.GetEnumerator());
mockDbSet.Setup(x => x.Add(It.IsAny<T>())).Callback<T>(sourceList.Add);
mockDbSet.Setup(x => x.Remove(It.IsAny<T>())).Returns<T>(x => { if (sourceList.Remove(x)) return x; else return null; });
return mockDbSet.Object;
}
但是,我不能想出一个办法来嘲笑查找方法,它需要查询的表的主键。我可以在每个表的特定级别执行此操作,因为我可以检查数据库,获取PK,然后模拟该字段的Find方法。但是,我不能使用通用方法。
我想我也可以添加到EF自动生成的部分类中,以标记哪个字段是具有属性或某物的PK。但是我们有超过100个表格,如果您依靠人员来手动维护,那么代码会更难管理。
EF6是否提供了查找主键的任何方式,还是只在连接到数据库后才动态地知道?
你在找这样的东西:[link](http://stackoverflow.com/a/25199983/5048049)否则你可以更好地解释你在找什么? – peval27
这是我描述的第一个选择。这只是针对ActiveLoan集合做出特定的模拟,而不是针对任何通用集合的通用模拟。 –