我正在尝试为我的 DAL 层编写单元测试。

复杂的是 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);

关于c# - 如何在 Entity Framework Include() 中使用 Moq,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46761664/

10-12 17:40