gpt4 book ai didi

c# - 为什么我的最小起订量数据库对象没有产生任何结果

转载 作者:太空狗 更新时间:2023-10-30 00:18:37 26 4
gpt4 key购买 nike

我有一个最小起订量数据库,其中包含读取序列化实体的 json 文件并将它们反序列化为最小起订量数据库集的方法。当我设置 dbcontext 时,一个表具有所有预期结果,而另一个表具有 0 个结果。我的 Json 文件格式正确并经过验证,有 5 个条目。

    var airportLocationMoq = GetMockDbSet<Repository.Location>(@"Files/ObjectJson/Airports.json");
var storageAreaMoq = GetMockDbSet<Repository.StorageArea>(@"Files/ObjectJson/StorageAreas.json");
var dbContext = new Mock<DbContext>();
dbContext.Setup(x => x.Locations).Returns(airportLocationMoq.Object);
dbContext.Setup(x => x.StorageAreas).Returns(storageAreaMoq.Object);

var airportsFromDb = dbContext.Object.Locations.Where(x => x.Type == 1).ToList();
var storageAreasFromDb = dbContext.Object.StorageAreas.ToList(); //<-this results in 0 entries however there should be 5.

这些是读取 json 文件并将它们反序列化为 moq dbset 的方法:

public string LoadFile(string path)
{
return File.ReadAllText(path);
}

public List<T> GetData<T>(string path)
{
string json = LoadFile(path);
var dataList = JsonConvert.DeserializeObject<List<T>>(json);

return dataList;
}

public Mock<DbSet<T>> GetMockDbSet<T>(string path) where T : class
{
var data = GetData<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;

}

当我断点到“return mockSet”对象并打开结果 View 时,数据存在,列表被正确填充,在此处输入图像描述但是如果我将光标移开然后返回它并展开结果 查看数据消失时显示“枚举未产生任何结果”。如果我什至没有移动断点,这怎么可能。我只是简单地扩展了结果 View 以查看数据,将鼠标光标移开然后再钻回,在同一实例中,数据消失了。提供了屏幕截图。

Image 1

Image 2 - No Results

最佳答案

实际问题在于模拟的初始化方式。

mockSet.As<IQueryable<T>>().Setup(m => m.GetEnumerator()).Returns(data.GetEnumerator());

此设置为每个 GetEnumerator 返回相同的枚举器函数调用。枚举项目后,枚举器不会为后续调用产生更多结果。

需要修改设置以使用 lambda 表达式。这样,对于每个 GetEnumerator函数调用返回枚举器的新实例。

mockSet.As<IQueryable<T>>()
.Setup(m => m.GetEnumerator()).Returns(() => data.GetEnumerator());

我最初关于显式 IEnumerable<T> 的假设执行错误。

The DbSet<T> class doesn't have any ToList() method. To convert the DbSet<T> to a list the IEnumerable<T>.ToList() method is used.

The interface IEnumerable<T> is implemented by the DbSet<T> class explicitly. So I think, you need to setup your Mock<DbSet<T>> to return the correct enumerator even for the IEnumerable<T> interface.

mockSet.As<IEnumerable<T>>().Setup(m => m.GetEnumerator()).Returns(data.GetEnumerator());

关于c# - 为什么我的最小起订量数据库对象没有产生任何结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33524444/

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