EF6 DbSet<T> gibt null zurück, Moq
Habe ich eine typische Repository-Pattern-setup in meiner Anwendung mit einem DbContext
(EF6):
public class MyDbContext : EFContext<MyDbContext> {
public MyDbContext () { }
public virtual DbSet<CartItem> Cart { get; set; }
und ein repository:
public class GenericEFRepository<TEntity, TContext>
where TEntity : class, new()
where TContext : EFContext<TContext> {
private readonly TContext _context;
public GenericEFRepository(TContext context) {
_context = context;
}
//...
public virtual TEntity Insert(TEntity item) {
return _context.Set<TEntity>().Add(item);
}
Teste ich dies mit Moq 4.2 (folgende dieses tutorial) erstellen Sie ein mock-Kontext:
//Arrange
var mockSet = new Mock<DbSet<CartItem>>();
var mockContext = new Mock<MyDbContext>();
mockContext.Setup(c => c.Cart).Returns(mockSet.Object);
//Act
var service = new GenericEFRepository<CartItem, MyDbContext>(mockContext.Object);
service.Insert(new CartItem() {
Id = 1,
Date = DateTime.Now,
UserId = 1,
Detail = string.Empty
});
//Assert
mockSet.Verify(s => s.Add(It.IsAny<CartItem>()), Times.Once());
Das problem ist, dass, wenn ich erreichen dieser Zeile:
return _context.Set<TEntity>().Add(item);
_context.Set<TEntity>()
null zurück. Nach etwas googlen scheint es in EF5 war es notwendig, zurück IDbSet<T>
für Moq, zu verhöhnen, der gesetzt, aber nicht mit EF6. Ist dies nicht der Fall, oder bin ich etwas fehlt?
- Bin ich fehlt, wo Sie die
Set<T>()
Methode zum zurückgeben dermockSet
? - Sie müssen das klären. Nach dem tutorial habe ich verlinkt, die nur den Umgang mit dem set sind die Linien
var mockSet = new Mock<DbSet<CartItem>>();
undmockContext.Setup(c => c.Cart).Returns(mockSet.Object);
. - Das ist wahr, aber keine, wo in der tutorial-service-code (nach einem kurzen überfliegen) sehe ich Sie aufrufen
Set<T>()
, während Ihr es tut. Fügen Sie ein setup, und ich denke, es wird funktionieren. - Sieht aus wie du Recht hast! Ich denke, ich nahm an, da
Cart
und.Set<CartItem>()
wurden unter Bezugnahme auf die gleiche Sache, dass die EinrichtungCart
war ausreichend. Danke!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Fügen Sie ein setup für den
Set<T>()
Methode:Obwohl auf die Reale
EFContext
EigentumCart
undSet<CartItem>()
auf das gleiche Objekt beziehen, das mock der Kontext, die nicht wissen, Sie müssen also sagen Sie explizit, was Sie zurück.Da war es eine lose mock, der Aufruf einer Methode, der bisher nicht setup gibt den Standardwert, in diesem Fall ist
null
. Strenge mocks sind schön, beim suchen nach diesem Fehler, aber auch lassen Sie Wartungs-Kosten, die andere Leute nicht zu tun haben wollen mit.