gpt4 book ai didi

c# - 测试 Entity Framework 存储库 Update() 时 Moq 测试空引用异常

转载 作者:行者123 更新时间:2023-11-30 18:22:51 25 4
gpt4 key购买 nike

我正在尝试使用最小起订量测试我的 EF 存储库。

我的背景:

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; }
}

我的 repo :

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));
}

问题是我在尝试设置 Entry.State = Entity.Modified

的存储库更新方法中遇到空引用异常

我尝试在我的上下文中添加间接级别,但它不起作用。

我错过了什么?任何帮助将不胜感激。

最佳答案

_context 对象是您的模拟对象 mockContext 并且返回 null 的部分是 _context.Entry(entity) 因为您还没有将其设置为在测试中返回任何内容。

如果你添加这样的东西,对象 someObjectThatYouHaveSetup 是你想从 _context.Entry(entity) 返回的任何东西,它应该可以工作。

mockContext.Setup(x => x.Entry(photo)).Returns(someObjectThatYouHaveSetup)

关于c# - 测试 Entity Framework 存储库 Update() 时 Moq 测试空引用异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33388081/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com