Dzień dobry! Dziś krótko. Jak można zamockować wyciąganie danych przy pomocy DbContext w EF7? Sprawa ma się tak samo jak w poprzedniej wersji EF.
Załóżmy, że chcę zamockować wyciągnięcie danych z tablicy Venue. Klasycznie przy pomocą DbContextu wyciągnąłbym te dane w ten sposób:
var venues = dbContext.Set<Venue>();
Jeżeli chcę zamockować dbContext.Set<Venue>() to muszę wpierw stworzyć listę tego co chciałbym wyciągać:
var venue1 = new Venue { ID = 1, Address = "Wroclaw, pl. Grunwaldzki 18", Day = DayOfWeek.Monday, Descrition = "Rejestra 30 minut przed rozpoczeciem gry", Hour = 20, Minute = 0, Name = "Klub Bilardowy" }; var venue2 = new Venue { ID = 2, Address = "Wroclaw, Powstańców Śląskich 95", Day = DayOfWeek.Sunday, Descrition = "Rejestra 30 minut przed rozpoczeciem gry", Hour = 20, Minute = 0, Name = "Sky Tower" }; var venue3 = new Venue { ID = 2, Address = "Wroclaw, Wystawowa 1", Day = DayOfWeek.Wednesday, Descrition = "Rejestra 30 minut przed rozpoczeciem gry", Hour = 20, Minute = 0, Name = "Hala Stulecia" }; var venues = new List<Venue> { venue1, venue2, venue3 };
Venues muszą trzeba zrzutować do Queryable.
var data = venues.AsQueryable();
Następnie mockujemy.
var mockSet = new Mock<DbSet<Venue>>(); mockSet.As<IQueryable<Venue>>().Setup(m => m.Provider).Returns(data.Provider); mockSet.As<IQueryable<Venue>>().Setup(m => m.Expression).Returns(data.Expression); mockSet.As<IQueryable<Venue>>().Setup(m => m.ElementType).Returns(data.ElementType); mockSet.As<IQueryable<Venue>>().Setup(m => m.GetEnumerator()).Returns(data.GetEnumerator()); var mockContext = new Mock<DbContext>(); mockContext.Setup(m => m.Set<Venue>()).Returns(mockSet.Object);
A jak można dobrać się do zamockowanych elementów?
var context = mockContext.Object as DbContext; var venues = context.Set<Venue>(); var firstVenue = venues.ElementAt(0);
Powodzenia!
Linki, które okazały się dla mnie przydatne:
Testing with a mocking framework (EF6 onwards)
EF6 DbSet<T> returns null in Moq