【问题标题】:How to mock an interface for entity framework?如何模拟实体框架的接口?
【发布时间】:2013-11-13 14:56:20
【问题描述】:

我按照here 的回答为实体框架中的 DbContext 创建了一个接口。问题是,我不知道如何使用它进行单元测试。我试图测试的控制器有两个构造函数。一个没有参数并将 IDbContext 实例变量设置为新的 DbContext。另一个采用 IDbContext 并设置相同的实例变量。我正在测试的方法就是这样做

return context.EntitySet<question>().ToList();

以下是我使用 Moq 和测试控制器的失败尝试。我没有更改答案中列出的接口或部分类中的任何内容。也许我需要添加一些东西?

            Mock<IDbContext> mockContext = new Mock<IDbContext>();
        question TestQuestion = new question { 
            Id = 1,
            ToAsk = "Did this test work?"
        };
        mockContext.Object.EntitySet<question>().Add(TestQuestion);

        QuestionsController controller = new QuestionsController( mockContext.Object );
        List<DHT.Entity.Models.question> questions = controller.Get();
        Assert.AreEqual(questions.Count, 1);

我对 .NET 和 C# 还很陌生,所以如果我做的一切都完全错误,请告诉我。我给出的链接中的方法似乎比实现整个存储库模式更简单。我只是想找到最简单的方法来对我的代码进行单元测试。

【问题讨论】:

  • Effort 是一个不错的 EF 单元测试工具。
  • 谢谢肖恩,我得看看那个。看起来很有希望。

标签: c# entity-framework unit-testing


【解决方案1】:

您可以使用 FakeDbSet NuGet 包或实现自己的InMemoryDbSet&lt;T&gt; 类(代码 sn-p 中使用的InMemoryDbSet&lt;T&gt; 是来自 FakeDbSet 包的那个):

Mock<IDbContext> mockContext = new Mock<IDbContext>();
question TestQuestion = new question { 
    Id = 1,
    ToAsk = "Did this test work?"
};
IDbSet<question> questions = new InMemoryDbSet<question>(true){ TestQuestion };
mockContext.Setup(c => c.EntitySet<question>()).Returns(questions);

QuestionsController controller = new QuestionsController( mockContext.Object );
List<DHT.Entity.Models.question> questions = controller.Get();
Assert.AreEqual(questions.Count, 1);

【讨论】:

  • 谢谢!我能够让它工作。出于某种原因, InMemoryDbSet 上的真正参数会导致空对象引用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多