如何模拟实体框架的接口?

时间:2013-11-13 14:56:21

标签: c# entity-framework unit-testing

我按照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#的新手,所以如果我做的一切都完全错了,请告诉我。我给出的链接中的方法似乎比实现整个存储库模式更简单。我只是想找到最简单的单元测试代码的方法。

1 个答案:

答案 0 :(得分:0)

您可以使用FakeDbSet NuGet包或实现您自己的InMemoryDbSet<T>类(代码片段中使用的InMemoryDbSet<T>是来自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);