[英]Mocking Entity Framework repository pattern
我有一個定義為的接口:
public interface IRepository<TEntity> where TEntity : BaseEntity
{
...
IEnumerable<TEntity> Get(
Expression<Func<TEntity, bool>> filter = null,
Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null,
string includeProperties = "");
...
}
和我的實現為:
public class Repository<TEntity> : IRepository<TEntity> where TEntity : BaseEntity
{
internal MyContext context;
internal DbSet<TEntity> dbSet;
public Repository(MyContext context)
{
this.context = context;
this.dbSet = context.Set<TEntity>();
}
public virtual IEnumerable<TEntity> Get(
Expression<Func<TEntity, bool>> filter = null,
Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null,
string includeProperties = "")
{
IQueryable<TEntity> query = dbSet;
if (filter != null)
{
query = query.Where(filter);
}
foreach (var includeProperty in includeProperties.Split
(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
{
query = query.Include(includeProperty);
}
if (orderBy != null)
{
return orderBy(query).ToList();
}
else
{
return query.ToList();
}
}
}
最后,我的代碼調用了此代碼:
Repository.Get(r =>
r.SourceOrganisationId == id,
null, // No ordering
"DestinationOrganisation") // Include the company
.Select(d => d.DestinationOrganisation).OrderBy(c => c.Name);
我想對查詢進行單元測試,以確保我具有正確的where子句,並且在結果中包括一個額外的實體。
我一直在研究如何使用Moq模擬DbContext和DbSet,但是看不到如何仍然具有包含的EF功能。 我發現的大多數示例都在模擬一個簡單的GetById。 基本上,我不想模擬EF,只需從內存而不是從Db中讀取它即可。
有任何想法嗎?
謝謝
在進一步研究之后,我意識到我想做的事是不可能的。
我想要的是在內存中模擬數據庫,然后測試包括Include
方法在內的查詢是否有效(例如,有些測試包含相關的實體,而有些則沒有)。 我不想模擬“ Include
但實際上我希望它對我的內存列表實施。 這是不可能的,因為從以下內容開始 :
這種差異的一個例子是加載相關數據。 如果您創建了一系列每個都有相關帖子的Blog ,那么在使用內存數據時,始終會為每個Blog加載相關帖子 。 但是,在針對數據庫運行時,僅在使用Include方法時才會加載數據。
因此,建議始終包括某種級別的端到端測試(除了單元測試之外),以確保您的應用程序可以正確地針對數據庫運行。
有一個名為Effort的工具,非常適合實體框架單元測試。 可能值得一看,看看它是否符合您的要求?
從他們的主頁:
它基本上是一個ADO.NET提供程序,它在輕量級進程內主內存數據庫而不是傳統的外部數據庫上執行所有數據操作
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.