2010-04-26 34 views
2

我是新来开发单元测试,我找不到如何测试我有一个现有的类的例子。单元测试示例,在具有必填字段的类上?

该类有一个保存方法,当用户在UI中单击保存时,该方法将在数据库中执行插入或更新操作。但是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 

类似的东西吗?

那么可选的其他领域呢?我如何测试保存方法以确保它能正确使用所有这些值?

正试图使用​​BDD,但不知道如果我应该尝试它。

在调用测试方法时,无法找到任何需要很多属性的类的示例。

回答

1

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

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

该代码不言自明。在测试方法的第一行中,我们正在设置环境以在单元测试中为User类添加验证功能。之后,我们创建一个新的用户并根据它的限制进行验证。最后一行检查blankfirstname字段的约束导致测试失败。

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

如果你只是学习单元测试,恕我直言,你可以选择一个更简单的目标为您的第一次单元测试。使用数据库进行单元测试要比测试没有依赖关系的普通对象复杂得多。一次练习和学习一件事情会更好。然而,如果你真的想要解决这个问题,你应该告诉我们你使用的语言,持久性机制,数据库 - 否则我们只是在黑暗中拍摄。例如。如果你碰巧使用Java,DbUnit是你的朋友。

一般来说,最好的做法是将代码依赖关系限制在代码中的一个薄层上,以便让代码的其余部分更易于测试。从你的描述来看,你的班级是否已经是该层的一部分,或者是否可以与数据库隔离尚不清楚。

+0

Aww我明白了。我现在正在学习一些基础知识。找到一本好书。 http://www.artofunittesting.com/ 这是VB.Net,我使用微软的nUnit版本。 数据库层和业务逻辑在同一个层上,在同一个类中。 我认为这本书实际上会有所帮助,因为它现在已经进入了真实世界的情景。谢谢你的帮助。 – Mastro 2010-04-27 19:36:04