Moq тестирует исключение нулевой ссылки при тестировании репозитория платформы сущностей Update()

Я пытаюсь проверить мой EF-репозиторий с помощью MOQ.

Мой контекст:

public class PhotoDbContext : DbContext, IDbContext
{
    public PhotoDbContext(){} // to enable data migrations

    public PhotoDbContext(string connectionString, bool debugOutput = false) : base(connectionString)
    {
        if (debugOutput)
            // Write to output all sql operations
            Database.Log = s => Debug.WriteLine(s);
    }

    public virtual new IDbSet<TEntity> Set<TEntity>() where TEntity : class
    {
        return base.Set<TEntity>();
    }

    public virtual new void SaveChanges()
    {
        base.SaveChanges();
    }

    public new DbEntityEntry Entry<TEntity>(TEntity entity) where TEntity : class
    {
        return base.Entry(entity);
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        Configure(modelBuilder);
    }

    public new void Dispose()
    {
        base.Dispose();
    }

    public new DbContextConfiguration Configuration
    {
        get { return base.Configuration; }
    }

Мой репо:

public  class PhotoRepository : IPhotoRepository
{
    private readonly IDbContext _context;

    public PhotoRepository(IDbContext context)
    {
        _context = context;
    }

    public void Save(Photo album)
    {
        _context.Set<Photo>().Add(album);
        _context.SaveChanges();
    }

    public void Update(Photo entity)
    {
        _context.Set<Photo>().Attach(entity);
        _context.Entry(entity).State = EntityState.Modified; **// null ref exception**
        _context.SaveChanges();
    }

И наконец тест, который я пытаюсь запустить.

    [TestMethod]
    public void UpdatePhoto()
    {
        var mockSet = new Mock<DbSet<Photo>>();

        var mockContext = new Mock<PhotoDbContext>();
        mockContext.Setup(m => m.Set<Photo>()).Returns(mockSet.Object);

        var service = new PhotoRepository(mockContext.Object);

        var photo = new Photo
        {
            Name = "123",
            Order = 2
        };

        service.Save(photo);

        mockSet.Verify(m => m.Add(It.IsAny<Photo>()), Times.Once);
        mockContext.Verify(m => m.SaveChanges(), Times.Once);

        photo.Name = "updated";
        service.Update(photo);

        mockSet.Verify(m => m.Add(It.IsAny<Photo>()), Times.Exactly(2));
        mockContext.Verify(m => m.SaveChanges(), Times.Exactly(2));
    }

Проблема в том, что я получаю исключительную ссылку Null в методе обновления репозиториев, где я пытаюсь установить Entry.State = Entity.Modified

Я попытался добавить уровень косвенности в моем контексте, но это не работает.

Что мне не хватает? Любая помощь будет оценена.

1 ответ

_context объект ваш поддельный объект mockContext и часть, которая возвращается null является _context.Entry(entity) потому что вы не настроили это, чтобы вернуть что-либо в тесте.

Если вы добавите что-то подобное с объектом someObjectThatYouHaveSetup быть тем, что вы хотите вернуться из _context.Entry(entity), он должен работать.

mockContext.Setup(x => x.Entry(photo)).Returns(someObjectThatYouHaveSetup)
Другие вопросы по тегам