繁体   English   中英

单元测试:真实数据库与模拟

[英]Unit test: Real database vs. mocking

我正在对我们团队正在构建的 asp.net MVC 3 Web 应用程序进行单元测试。

问题是我们必须模拟很多东西,我们的单元测试并没有涵盖所有与网络服务器和数据库相关的东西。

例子:

我有一个带有以下代码的方法:

public List<Useraccount> GetUseraccounts(Company company)
{
    return company.Useraccounts.ToList<Useraccount>();
}

我的开发人员抱怨他必须注入他自己准备的假公司对象。 他想从数据库中获得一个真实的对象。

我的问题:是否可以在单元测试中使用真正的数据库(也可以是 SQLite/SQLExpress 或其他东西)? 这有用吗? 优缺点都有什么?

如果没有真正的数据库,我们需要模拟太多的对象。 例如,我们无法验证此类调用是否有效:

Useraccount useraccount = UnitOfWork.UseraccountRepository.Get(u => u.EnableCode == enableCode && u.IsEnabled == false).Single<Useraccount>();

针对真实数据库的测试是集成测试,而不是单元测试。 您仍然可以以与单元测试相同的方式运行集成测试 - 也就是说,通过 nunit 或 mstest 或其他方式运行它们,并通过命令行或构建服务器上的类似方式运行它们 - 但有几个额外的步骤:

  1. 您需要设置测试数据,将其注入数据库,运行测试,然后再次删除测试数据。 在理想情况下,您应该在集成测试运行开始时创建一个测试数据库,然后运行所有测试,然后在所有集成测试完成后将其删除。 但这可能不切实际。

  2. 您的集成测试将比单元测试运行得慢得多。 通过运行它们来为此做好准备,例如,每晚在构建服务器作业中运行。

在使用 SqlLite 或其他方面,我会说不要使用您在现实世界中使用的确切类型的数据库,否则它不是一个值得信赖的测试。

尝试使用努力工具。 Effort是一个强大的工具,它可以方便地为基于实体框架的应用程序创建自动化测试。 它基本上是一个 ADO.NET 提供程序,它在轻量级进程内主内存数据库而不是传统的外部数据库上执行所有数据操作。 它也提供了一些直观的辅助方法,可以非常轻松地将此提供程序与现有的 ObjectContext 或 DbContext 类一起使用。 对现有代码的简单添加可能足以创建数据驱动的测试,这些测试可以在没有外部数据库的情况下运行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM