如何使用Moq与实体框架包括()

如何使用Moq与实体框架包括()

问题描述:

我想为我的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) 

嘲笑数据库访问代码的问题是,你在嘲笑最复杂的部分(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);