1

我正在对我们团队正在构建的 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>();
4

2 回答 2

2

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

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

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

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

于 2013-03-15T13:26:11.907 回答
1

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

于 2013-03-15T12:52:06.847 回答