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)