繁体   English   中英

模拟FirstOrDefault返回NullReferenceException

[英]Mock FirstOrDefault returns NullReferenceException

我想了解为什么当我调用dbContext.Object.Locations.FirstOrDefault(x => x.Id == id);时我的模拟dbset抛出NullReferenceException dbContext.Object.Locations.FirstOrDefault(x => x.Id == id);

我已经设置了我的模拟数据库集,如下所示:

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只是为了在逻辑正确时通过测试。

这解决了问题。 对于将来在AsNoTracking()或FirstOrDefault()返回NUllException的问题的任何人。

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

            mockSet.Setup(x => x.AsNoTracking()).Returns(mockSet.Object);

            return mockSet;
        }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM