2017-10-16 106 views
1

我想爲我的DAL層寫單元測試。如何使用Moq與實體框架包括()

複雜的是,DAL層有一個使用Include()的查詢。

我不知道如何模擬Include()方法。

模式

public class Apps 
    { 
     [Key] 
     [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
     [DataMember] 
     public int ID { get; set; } 

     [DataMember] 
     [Required(ErrorMessage = "App name required.")] 
     public string Name { get; set; } 

     public virtual ICollection<AppDataPermission> AppDataPermissions { get; set; } 

    } 

public class AppDataPermission{ 
     [Key] 
     [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
     [DataMember] 
     public int ID { get; set; } 

     public DataPermissions DataPermission { get; set; } 

     public virtual Apps App { get; set; } 
    } 

public enum DataPermissions 
{ 
     Admin = 1, 
     Support = 2 
    } 

DAL

public List<Apps> GetApps() 
     { 
      var apps = dbContext.Apps 
       .Include(x => x.AppDataPermission) 
       .ToList(); 
      return apps; 
     } 

我嘗試以下[https://msdn.microsoft.com/en-us/library/dn314429(v=vs.113).aspx][1]

,但我得到以下錯誤

System.ArgumentNullException occurred 
    HResult=0x80004003 
    Message=Value cannot be null. 
Parameter name: source 
    Source=EntityFramework 
    StackTrace: 
    at System.Data.Entity.Utilities.Check.NotNull[T](T value, String parameterName) 
    at System.Data.Entity.QueryableExtensions.Include[T,TProperty](IQueryable`1 source, Expression`1 path) 

回答

2

嘲笑數據庫訪問代碼的問題是,你在嘲笑最複雜的部分(linq-to-sql,導航屬性)。 我一般建議不要公開DAL對象。

無論如何,你還沒有顯示你的嘲諷代碼,但我假設你嘲笑public List<Apps> GetApps()

下面是一個方法來模擬它:

var mockRepo = new Mock<IMyAmazingRepository>(MockBehavior.Strict); 

var myMockedApps = new List<App>() { 
    new Apps { ID = 1, Name ="One", new List<AppDataPermission> { (...) }, 
    new Apps { ID = 2, Name ="Two", new List<AppDataPermission> { (...) } 
}; 

mockRepo.Setup(m => m.GetApps(_loggedInUserId)).Returns(myMockedApps);