单元测试示例,在包含必填字段的类上?

时间:2010-04-26 16:39:16

标签: unit-testing

我是开发单元测试的新手,我找不到如何测试现有类的示例。

该类有一个save方法,当用户在UI中单击Save时,该方法在数据库中执行插入或更新。但是save方法需要填充需要的字段。还有其他领域没有。

那么如何正确运行此测试?

试图写出来..

Give a user
When user saves object
Then Field1 is required
then Field2 is required
Then Field3 is required

WhenUserSavesObject()
object = new object
object.field1 IsNot Nothing
是这样的吗?

那么可选的其他字段呢?我如何测试save方法以确保它正确地获取所有这些值?

试图使用BDD但不确定我是否应该尝试。

在调用测试方法时找不到具有许多属性的类的任何示例。

2 个答案:

答案 0 :(得分:1)

您没有说出要用哪种语言实现项目和测试。例如,使用Groovy& Grails框架提供了一个很好的工具集,可以轻松地实现这些测试,并且可以很好地作为如何实现测试的例子。

void testUsernameIsRequiredToValidate() {
  mockForConstraintsTests User
  def user = new User(username: "")
  assertFalse user.validate()
  assertEquals "blank", user.errors["username"]
}

代码是自我解释的。在测试方法的第一行中,我们设置环境以在单元测试中向User类添加验证功能。之后,我们创建一个新用户并根据它的约束验证它。最后一行检查字段blank上的firstname - 约束导致测试失败。

class User {
  String firstname
  String password

  static constraints = {
    username(blank: false)
    password(blank: false, minSize: 6)
  }
}

有多个必需字段来验证User对象可以在几个小类中实现,以进行负面测试。对于正面测试,您将构建一个有效的User实例并对其进行验证。

void testUserWithUsernameAndAMinimumPasswordOfSixCharactersIsValid() {
  mockForConstraintsTests User
  def user = new User(username: "admin", password: "secret")
  assertTrue user.validate()
}

如果您正在使用其他框架和/或语言进行开发,那么您可能会对模拟掉依赖项并将测试中的代码分解为可测试的小部分感兴趣。

答案 1 :(得分:1)

如果你只是学习单元测试,恕我直言,你可以为你的第一次单元测试选择一个更简单的目标。使用DB进行单元测试比测试没有依赖项的普通对象要复杂得多。最好一次练习和学习一件事。

但是,如果你真的想解决这个问题,你应该告诉我们你正在使用什么语言,持久性机制,数据库 - 否则我们只是在黑暗中拍摄。例如。如果您碰巧使用Java,DbUnit就是您的朋友。

通常,最好将DB上的依赖项限制在代码中的薄层,以便使代码的其余部分更容易测试。从您的描述中不清楚您的类是否已经是该层的一部分,或者它是否可以与数据库隔离。