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 der mockSet?
  • 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>>(); und mockContext.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 Einrichtung Cart war ausreichend. Danke!
Schreibe einen Kommentar