【发布时间】:2015-12-21 12:11:44
【问题描述】:
我想了解为什么当我调用 dbContext.Object.Locations.FirstOrDefault(x => x.Id == id); 时,我的模拟 dbset 会抛出 NullReferenceException
我已经设置了我的模拟数据库集,详情如下:
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;
}
private Mock<DbContext> LoadMockDataBase(ref Dictionary<string, object> mockDictionary)
{
var mockSetLocations = GetMockDbSet<Repository.Location>(@"Files/ObjectJson/Locations.json");
dbContext.Setup(l => l.Locations).Returns(mockSetLocations.Object);
dbContext.Setup(x => x.Locations.AsNoTracking()).Returns(mockSetLocations.Object);
return dbContext;
}
我了解,如果我删除 AsNoTracking() 这可以解决问题,但是我不想限制应用程序不使用 AsNoTracking 只是为了在逻辑正确时通过测试。
【问题讨论】:
-
因为您没有在 dbContext 模拟对象中设置“dbContext.Object.Locations”
-
嗨@gabba你能解释一下吗,我不明白。
-
@ThaAkhemist,您在以下位置获得 NullReferenceException:dbContext.Object.Locations.FirstOrDefault(x => x.Id == id);因为您没有设置: dbContext.Object.Locations 以返回正确的数据。请展示你如何实现 mockSetLocations.Object
-
Object 是模拟对象实例,在本例中为 DbSet。但我解决了这个问题。
标签: c# asp.net unit-testing mocking moq