Mockowanie DbContextu w EF7. DSP16 – część 11

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

Leave a Comment

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *