我目前使用的擴展方法一般模擬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集合做出特定的模擬,而不是針對任何通用集合的通用模擬。 –