Unit testing 内存数据库vs.NET内核中的Moqing框架

Unit testing 内存数据库vs.NET内核中的Moqing框架,unit-testing,asp.net-core-mvc,tdd,moq,in-memory-database,Unit Testing,Asp.net Core Mvc,Tdd,Moq,In Memory Database,我们将在下一个项目中实施TDD方法。所以我一直在学习ASP.NET内核中使用NUnit进行单元测试。由于我是新来的,我对一些事情感到困惑。因此,我想与大家分享这些问题,以便根据专家意见做出决策 模拟数据库和内存数据库的优缺点是什么 在哪种情况下,我们应该使用模拟,在哪种情况下我们应该使用InMemory数据库提供程序 使用内存还是使用模拟,哪个方法更好 我们能否在同一个项目中同时实施这两种方法 对于集成测试,我们应该使用模拟还是内存 在单元测试中使用内存数据库是更好的方法吗 在测试业务层时,我们

我们将在下一个项目中实施TDD方法。所以我一直在学习ASP.NET内核中使用NUnit进行单元测试。由于我是新来的,我对一些事情感到困惑。因此,我想与大家分享这些问题,以便根据专家意见做出决策

  • 模拟数据库和内存数据库的优缺点是什么
  • 在哪种情况下,我们应该使用模拟,在哪种情况下我们应该使用InMemory数据库提供程序
  • 使用内存还是使用模拟,哪个方法更好
  • 我们能否在同一个项目中同时实施这两种方法
  • 对于集成测试,我们应该使用模拟还是内存
  • 在单元测试中使用内存数据库是更好的方法吗
  • 在测试业务层时,我们应该使用模拟还是内存数据库
  • 在测试MVC控制器时,我们应该使用模拟还是内存数据库

  • 请帮我找到这些问题的答案。也许,有些问题是相似的,但是,为了更好地理解你们,我不想删除它们。谢谢。

    对这一切有各种各样的观点,所以我想你很难得到任何明确的答案。也就是说,我个人的看法是,内存中的数据库可以用于单元测试。有些人认为,在EF中使用内存中的数据库在技术上是集成测试,因为实际上涉及到所有EF机器。然而,我有两点反对这种理论:1)它在内存中,因此实际上不是一个实际的集成测试(因为在生产中显然不会使用内存中的数据库),2)这与创建一个从内存中的集合返回数据的复杂模拟没有什么区别

    因此,我认为在EF中使用内存中的数据库提供程序进行单元测试是很好的。它只是为您节省了构建一个mock的时间,这对于类似于mock一类的ORM,比如EF,是非常重要的。然而,它也有自己的包袱,所以我只建议您在测试本质上依赖EF的方法时这样做。例如,如果您将EF上下文注入到一个类中,并且您正在测试一个依赖于该类的方法,那么可以使用内存中的提供程序并注入一个实际的上下文。但是,如果您只是在测试一个方法,该方法对您传递给它的任意数据集进行操作,那么只需使用一个文本固定装置,而不是引导EF上下文,只需从中提取一些数据以提供给该方法


    就集成测试而言,它实际上取决于您正在测试的内容。即使根据定义,集成测试涉及多个不同的组件,理想情况下仍应尽可能限制测试的范围。因此,如果您正在做一些类似于测试某个操作结果的事情,那么您应该使用内存中的数据库进行测试,因为您关心的是结果,而不是与数据库的连接是否正常。然而,如果您有一个集成测试,它实际上是在研究与数据库相关的集成,那么您最好模拟一个真实的连接,以确保连接字符串之类的东西是正确的。不过,在大多数情况下,是的,您应该使用内存中的提供程序对大多数事情进行集成测试。

    请编辑问题,将其限制为特定问题,并提供足够的详细信息,以确定适当的答案。避免同时问多个不同的问题。请参阅页面以获取澄清此问题的帮助