我如何将其转换为单元测试?

时间:2010-09-15 21:15:19

标签: unit-testing

我看到的单元测试的大多数例子都是简单的测试,比如Assert.That(5,2 + 3),但我如何将单元测试合并到一个获取用户信息并将其保存到数据库的方法。例如,我有一个带有User对象的Register方法。用户对象属性从Web表单填充,然后保存到数据库。我能做些什么可行的单元测试呢?

这是一个例子。假设User对象具有一些必需的字段,例如Email,FirstName,LastName。有效的单元测试是否断言Email不为空或为空。这同样适用于其他必填字段。所以在我上面的场景中,这是一个单元测试。

[Test]
public void EmptyEmailShouldReturnError()
{
   User user = new User();
   user.Email = "";
   //Set other properties

   //Not sure of nunit syntax here, so I will make something up.
   Assert.IsNotEmpty(user.Email);

}

3 个答案:

答案 0 :(得分:4)

那些不是单元测试。单元测试用于单独测试事物。直接与数据库交互的东西无法单独测试,因为它们依赖于此数据库。如果要单独测试内容,则需要引入抽象级别以避免组件之间的强耦合。在单元测试中,常见的技术是用模拟对象替换某个组件。只有在您抽象了数据库访问层时才可以这样做。

现在回到这个问题。您如何测试数据库访问层?这些被称为集成测试。有许多技术可以与数据库进行集成测试。其中一些包含一个测试数据库,该数据库在Setup方法中重新创建并放入TearDown方法中,因此所有测试都假定一些有效的状态可供使用。因此,您可能有一些脚本使用测试数据创建并填充数据库,并在运行每个测试之前调用这些脚本。您甚至可以将所有内容都包装在数据库事务中,该事务将在最后回滚。

答案 1 :(得分:2)

嗯,这取决于你试图“单位”测试的内容。

  • 您是否正在测试验证正在创建的用户是否有效的业务逻辑?
  • 您是否正在测试数据库访问层(数据库访问代码和/或存储过程)?
  • 你想同时测试两个吗?

如果要测试业务逻辑,那么可以模拟数据库访问层,然后验证是否将正确的内容传递给数据库层。

如果要测试数据库层,则创建一个测试数据库,单元测试可以写入和读取。

如果要测试两者,则创建测试数据库,运行业务逻辑以创建用户。然后查询该用户,并验证其上的所有数据。这不仅仅是一个“单元”测试,但它是一个有效的测试,可以在单元测试框架内完成。

答案 2 :(得分:1)

我不认为你真的是指严格意义上的“单元测试”(涉及数据库或方法之外的任何其他东西使它成为“集成”测试),但如果我正在创建一个自动化测试对于你提到的方法,我会做一个创建User对象的测试,将它传递给Register方法,然后从数据库中检索User并将其与原始对象进行检查,以确保它们完全相同。最后一步可能涉及一些Assert调用。

您还需要其他测试 - 一个空参数测试,以查看传入null对象时会发生什么,以及某些使用各种“奇怪”数据的测试,以查看该方法如何处理所有用例。