gpt4 book ai didi

c# - DbSet 模拟,第二次调用 ToList 时没有结果

转载 作者:IT王子 更新时间:2023-10-29 04:46:34 25 4
gpt4 key购买 nike

我正在尝试模拟 DbContext 和 DbSet。这适用于我以前的单元测试,但是当我的代码第二次调用 DbSet 上的 ToList 方法时出现问题。

首先 dbSet.ToList() 返回模拟结果。第二个返回 0 个元素;

       var queryableData = new List<string>{ "a", "b", "c" }.AsQueryable();

var mockDbSet = new Mock<DbSet<string>>();
var q = mockDbSet.As<IQueryable<string>>();
q.Setup(m => m.Provider).Returns(queryableData.Provider);
q.Setup(m => m.Expression).Returns(queryableData.Expression);
q.Setup(m => m.ElementType).Returns(queryableData.ElementType);
q.Setup(m => m.GetEnumerator()).Returns(queryableData.GetEnumerator());

DbSet<string> dbset = mockDbSet.Object;
IQueryable<string> query = dbset;

//RESULTS: abc
var a1 = dbset.ToList();
foreach (var a in a1)
Console.Write(a);

//NO RESULTS
var a2 = dbset.ToList();
foreach (var a in a2)
Console.Write(a);

最佳答案

每次调用 GetEnumerator 时,您都会返回完全相同的枚举器实例。当它枚举一次时,它就完成了,EF 不会调用它的 Reset 方法,而是请求一个新的枚举器。

但是您返回刚刚生成所有元素并且不再生成的元素。

相反,返回一个返回枚举器的函数,它会在您每次请求时返回一个新的枚举器。

 q.Setup(m => m.GetEnumerator()).Returns( () => queryableData.GetEnumerator() );

关于c# - DbSet 模拟,第二次调用 ToList 时没有结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23460893/

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