我已经设置了mock dbset,它读取了一堆json文件并将它们反序列化为模拟dbset。我已将AsNoTracking添加到我的变量中,原因有两个: 1)我将在数据库中存储一个新对象,并且不需要跟踪对象,因为它会更新条目。 2)表现。
代码工作正常但是模拟不起作用,因为我已经添加了AsNoTracking()方法,不将结果存储在dbcontext缓存中。这现在返回一个ArgumentNullException。如果我删除AsNoTracking测试通过,但我不想被迫必须删除AsNoTracking只是为了通过单元测试。
调试单元测试时,它会抛出ArugmentNullException:
var myObj = dbContext.MyTable.AsNoTracking().Where(b => b.Id == param.Id).Include(b => b.Column1).Include(b => b.Column2).Include(b => b.Colum3).FirstOrDefault();
但是,如果通过浏览器运行,这可以正常工作,正确返回数据,该对象不为空。
public Mock<DbSet<T>> GetMockDbSet<T>(string path) where T : class
{
var data = GetObjectList<T>(path).AsQueryable();
var mockSet = new Mock<DbSet<T>>();
mockSet.As<IQueryable<T>>().Setup(m => m.Provider).Returns(data.Provider);
mockSet.As<IQueryable<T>>().Setup(m => m.Expression).Returns(data.Expression);
mockSet.As<IQueryable<T>>().Setup(m => m.ElementType).Returns(data.ElementType);
mockSet.As<IQueryable<T>>().Setup(m => m.GetEnumerator()).Returns(()=>data.GetEnumerator());
return mockSet;
}
我可以对上面的代码做些什么,以便如果将AsNoTracking()添加到从dbset返回对象的var中,结果不为null。
答案 0 :(得分:2)
我找到了答案。这可以通过模拟asnotracking来返回你想要的集合来完成,如下所示:
我在嘲笑EntityA,一旦我做了所有反序列化和模拟设置我就嘲笑AsNoTracking:
示例:
entityA.Setup(x => x.AsNoTracking()).Returns(entityA.Object);