[英]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 或其他方式运行它们,并通过命令行或构建服务器上的类似方式运行它们 - 但有几个额外的步骤:
您需要设置测试数据,将其注入数据库,运行测试,然后再次删除测试数据。 在理想情况下,您应该在集成测试运行开始时创建一个测试数据库,然后运行所有测试,然后在所有集成测试完成后将其删除。 但这可能不切实际。
您的集成测试将比单元测试运行得慢得多。 通过运行它们来为此做好准备,例如,每晚在构建服务器作业中运行。
在使用 SqlLite 或其他方面,我会说不要使用您在现实世界中使用的确切类型的数据库,否则它不是一个值得信赖的测试。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.