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