2017-10-16 1 views
1

Ich versuche, Einheitentest für meine DAL-Schicht zu schreiben.So verwenden Sie Moq mit Entity Framework Include()

Die Komplikation ist, dass die DAL-Schicht eine Abfrage hat, die Include() verwendet.

Ich weiß nicht, wie man die Include() Methode vortäuscht.

Modelle

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; 
     } 

Ich habe versucht folgende [https://msdn.microsoft.com/en-us/library/dn314429(v=vs.113).aspx][1]

Aber ich Fehler erhalten folgende

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) 

Antwort

2

Das Problem mit dem Datenbankzugriffscode ist, dass Sie sich über den kompliziertesten Teil lustig machen (linq-to-sql, Navigationseigenschaften). Ich empfehle generell DAL-Objekte nicht zu exponieren.

Wie auch immer, Sie haben Ihren spöttischen Code nicht gezeigt, aber ich gehe davon aus, dass Sie sich lustig machen public List<Apps> GetApps().

ist hier eine Methode, um es zu verspotten:

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); 
Verwandte Themen