In Memory database vs Moqing framework in .NET Core

In Memory database vs Moqing framework in .NET Core

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

  1. 模拟数据库和内存数据库的优缺点是什么?
  2. 什么情况下应该使用Mocking,什么情况下应该使用InMemory database provider?
  3. 哪种方法更好,使用 InMemory 还是使用 Mocking?
  4. 我们可以在同一个项目中同时实施这两种方法吗?
  5. 对于集成测试,我们应该使用 mocking 还是 In Memory?
  6. 在单元测试中使用内存数据库是更好的方法吗?
  7. 在测试业务层时,我们应该使用 Mocking 还是 In-Memory 数据库?
  8. 在测试 MVC Controller 时,我们应该使用 Mocking 还是 In-Memory 数据库?

请帮我找到这些问题的答案。可能是这样,有些问题是相似的,但是,我不想删除它们以便让你们更好地理解。谢谢。

对于所有这些,存在各种各样的意见,因此我认为您将很难获得任何明确的答案。也就是说,我个人认为内存数据库非常适合用于单元测试。有些人认为,当您在 EF 中使用内存数据库时,它在技术上是集成测试,因为您实际上涉及所有 EF 机制。但是,我有两点反对该理论:1)它在内存中,因此实际上不是一个现实的集成测试(因为您显然不会在生产中使用内存数据库)和 2)两者之间几乎没有区别并创建一个复杂的模拟,returns 来自某些内存集合的数据。

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

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