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

标签 c# entity-framework generics entity-framework-6 moq

我目前正在使用扩展方法将 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/

相关文章:

c# - 无法从 ICollection 中删除最后一项

java - 如何使这个(泛型)类型规范发挥作用?

c# - 如何在 MVC 网页中重用模型或 DAL 和 BLL

c# - 在 ulong (C#) 中获得最后一个有效位的最快方法?

c# - 为 Controller 中的强类型模型获取 "Key"

c# - 何时需要dispose()的规则是什么?

c# - 如何取消对匿名方法回调的监听?

c# - Entity SQL or StoredProcedure,用什么?

c# - EntityFramework 中使用 'where' 语句的通用查询

c# - 通用模板错误