Na blogu pojawiły się ostatnio dwa wpisy pokazujące w jaki sposób mnożna zamockować DbSet<TEntity> wykorzystując Moq:
- wywołania synchroniczne – Mockowanie typów DbContext oraz DbSet z wykorzystaniem Moq
- wywołania asynchroniczne – EntityFramework – testowanie zapytań asynchonicznych
Opisane rozwiązania połączyłem w jednej bibliotece i opublikowałem jako pakiet NuGet – Moq.EntityFramework.Helpers.
Pakiet ten ułatwia mockowanie DbContext z EnitityFrameworka. Dzięki niemu testowanie metod wykorzystujących DbSet<TEntity> będzie prostsze oraz efektywniejsze.
Przed użyciem pakietu należy go najpierw zainstalować:
Install-Package Moq.EntityFramework.Helpers
A następnie wykonać następujące 3 kroki:
- Utworzyć mocka DbContext:
var userContextMock = new Mock<UsersContext>();
- Przygotować elementy, które mają zostać zwrócone:
IList<User> users = ...;
- Zasetupować właściwość DbSet:
userContextMock.Setup(x => x.Users).Returns(users);
I tyle wystarczy. Można już zacząć przeprowadzać testy na elementach wykorzystujących DbContext.
Kod i więcej przykładów można znaleźć na moim GitHubie.
I jeszcze drobnostka. Kod dziedziczący po DbContext wygląda następująco:
public class UsersContext : DbContext { public virtual DbSet<User> Users { get; set; } }
Zasetupować ?
:). Masz jakąś inną propozycję?