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

时间:2013-03-15 12:42:41

标签: asp.net asp.net-mvc entity-framework unit-testing moq

我目前正在考虑对我们团队正在构建的asp.net mvc 3网络应用程序进行单元测试。

问题在于我们真的必须嘲笑很多东西,我认为我们的单元测试不会涵盖所有与网络服务器和数据库相关的东西。

示例:

我有一个方法,包含以下代码:

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>();

2 个答案:

答案 0 :(得分:1)

针对真实数据库进行测试是集成测试,而不是单元测试。您仍然可以使用与单元测试相同的方式运行集成测试 - 也就是说,通过nunit或mstest或其他任何方式运行它们,并通过命令行或构建服务器上的某些程序运行它们 - 但还有一些额外的步骤:< / p>

  1. 您需要设置测试数据,将其注入数据库,运行测试,然后再次删除测试数据。在理想的世界中,您将在集成测试运行开始时创建测试数据库,然后运行所有测试,然后在完成所有集成测试后将其删除。但这可能是不切实际的。

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

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

答案 1 :(得分:0)

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