c# - Entity Framework 6 模拟包含 dbset 上的方法

标签 c# entity-framework-6

一直在谷歌上搜索有关如何在 EF6 中模拟 dbset 上的 include 方法的问题的解决方案。 这个问题在这里有详细记录:-

http://entityframework.codeplex.com/discussions/461731

不幸的是,那里似乎没有有效的解决方案。

有没有人找到解决方法?

我确实理解我们不应该真正模拟 EF6 上下文,但项目负责人坚持这样做。

提前致谢。

最佳答案

我遇到了与上述@GetFuzzy 相同的戏剧性事件 - 似乎无论我做什么,只要在 Moq DbSet 上进行 Include() 调用,我都无法避免 NullReferenceException。不幸的是,另一个答案中的 Github 示例不起作用:Set.Include() 始终返回 null。

在摆弄了一段时间之后,我想出了一个解决方法。

[Test]
public void CanUseIncludeWithMocks()
{
    var child = new Child();
    var parent = new Parent();
    parent.Children.Add(child);

    var parents = new List<Parent> { parent };
    var children = new List<Child> { child };

    var parentsDbSet1 = new FakeDbSet<Parent>();
    parentsDbSet1.SetData(parents);

    var parentsDbSet2 = new FakeDbSet<Parent>();
    parentsDbSet2.SetData(parents);

    parentsDbSet1.Setup(x => x.Include(It.IsAny<string>())).Returns(parentsDbSet2.Object);

    // Can now test a method that does something like: context.Set<Parent>().Include("Children") etc
}


public class FakeDbSet<T> : Mock<DbSet<T>> where T : class
{
    public void SetData(IEnumerable<T> data)
    {
        var mockDataQueryable = data.AsQueryable();

        As<IQueryable<T>>().Setup(x => x.Provider).Returns(mockDataQueryable.Provider);
        As<IQueryable<T>>().Setup(x => x.Expression).Returns(mockDataQueryable.Expression);
        As<IQueryable<T>>().Setup(x => x.ElementType).Returns(mockDataQueryable.ElementType);
        As<IQueryable<T>>().Setup(x => x.GetEnumerator()).Returns(mockDataQueryable.GetEnumerator());
    }
}

我真的不喜欢必须有两个假 DbSet 的笨拙,但由于某些原因这不起作用:

parentsDbSet1.Setup(x => x.Include(It.IsAny<string>())).Returns(parentsDbSet1.Object);

有人对此有解释吗?

关于c# - Entity Framework 6 模拟包含 dbset 上的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20002873/

相关文章:

c# - 局域网宠物项目

c# - 尝试在 ASP.NET MVC 应用程序中打开 db4o 数据库时,是什么导致此 DatabaseFileLockedException?

c# - SaveFileDialog 上的自定义检查文件名

entity-framework - Entity Framework 6 Code First 迁移 - 用于生产的多个分支

c# - 如何使用 EF6 和 SQL Server 捕获 UniqueKey Violation 异常?

c# - 如何让一个物体精确定位并减速到指定位置停止?

C#:使用 ownerdrawtext 绘制的 TreeView 所有者以及单击节点时奇怪的黑色突出显示

linq - 如何使用SqlAzureExecutionStrategy和 "Nolock"

c# - 使用 Entity Framework 代码保存分离的对象图首先导致主键冲突

c# - 防止数据网格在 C# 中加载 Entity Framework 导航属性