gpt4 book ai didi

c# - 有没有一种方法可以用 Moq 来模拟 DbSet.Find 方法?

转载 作者:太空狗 更新时间:2023-10-30 00:23:22 29 4
gpt4 key购买 nike

我目前正在使用扩展方法将 DbSets 模拟为一个列表:

    public static DbSet<T> AsDbSet<T>(this List<T> sourceList) where T : class
{
var queryable = sourceList.AsQueryable();
var mockDbSet = new Mock<DbSet<T>>();
mockDbSet.As<IQueryable<T>>().Setup(m => m.Provider).Returns(queryable.Provider);
mockDbSet.As<IQueryable<T>>().Setup(m => m.Expression).Returns(queryable.Expression);
mockDbSet.As<IQueryable<T>>().Setup(m => m.ElementType).Returns(queryable.ElementType);
mockDbSet.As<IQueryable<T>>().Setup(m => m.GetEnumerator()).Returns(queryable.GetEnumerator());
mockDbSet.Setup(x => x.Add(It.IsAny<T>())).Callback<T>(sourceList.Add);
mockDbSet.Setup(x => x.Remove(It.IsAny<T>())).Returns<T>(x => { if (sourceList.Remove(x)) return x; else return null; } );

return mockDbSet.Object;
}

但是,我想不出一种方法来模拟 Find 方法,该方法根据表的主键进行搜索。我可以在每个表的特定级别执行此操作,因为我可以检查数据库、获取 PK,然后只需模拟该字段的 Find 方法。但是我不能使用通用方法。

我想我还可以添加到 EF 自动生成的部分类中,以标记哪个字段是具有属性或其他内容的 PK。但是我们有 100 多个表,如果您依赖人员手动维护它,这会使代码更难管理。

EF6 是否提供了任何查找主键的方法,还是仅在连接到数据库后才动态知道?

最佳答案

经过一段时间的思考,我想我找到了目前可用的“最佳”解决方案。我只有一系列直接检查扩展方法中类型的 if 语句。然后我转换为我需要设置查找行为的类型,并在完成后将其转换回通用类型。它只是伪泛型,但我想不出更好的东西。

        if (typeof(T) == typeof(MyFirstSet))
{
mockDbSet.Setup(x => x.Find(It.IsAny<object[]>())).Returns<object[]>(x => (sourceList as List<MyFirstSet>).FirstOrDefault(y => y.MyFirstSetKey == (Guid)x[0]) as T);
}
else if (typeof(T) == typeof(MySecondSet))
{
mockDbSet.Setup(x => x.Find(It.IsAny<object[]>())).Returns<object[]>(x => (sourceList as List<MySecondSet>).FirstOrDefault(y => y.MySecondSetKey == (Guid)x[0]) as T);
}
...

关于c# - 有没有一种方法可以用 Moq 来模拟 DbSet.Find 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39857351/

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