单元测试域类的唯一约束

时间:2014-06-24 19:15:38

标签: unit-testing grails

我使用Grails 2.4.1并且无法理解如何正确测试域类的唯一约束。

我的域类看起来像:     class Person {

    String name
    static constraints = {
        name( unique: true, blank: false )
    }
}

和我的测试:

@TestFor(Person)
@TestMixin(GrailsUnitTestMixin)
class PersonSpec extends Specification {

void "name should be unique"() {
    given:
    mockForConstraintsTests Person

    when:
    def one = new Person( name: 'john' )

    then:
    one.save()

    when:
    def two = new Person( name: 'john' )

    then:
    ! two.validate()
    two.errors.hasFieldErrors( 'name' )

}

尽管显然违反了唯一约束,但第二个实例正在验证。有人可以解释一下这里发生了什么,以及我该如何最好地纠正它?

谢谢!

- 约翰

2 个答案:

答案 0 :(得分:5)

我不认为这是通过触发它们来测试约束的最佳方法。 通常我们要测试我们的代码是否有效,而不是Grails正在验证约束。

为什么测试框架(即Grails)?希望Grails的人已经这样做了:-) (是的,有些情况检查框架是有意义的,但我不认为这是一个)。

所以唯一要测试的是我们在域类上放置了正确的约束:

@TestFor(Person)
class PersonSpec extends Specification {

    void "name should have unique/blank constraints"() {
        expect:
        Person.constraints.name.getAppliedConstraint('unique').parameter
        ! Person.constraints.name.getAppliedConstraint('blank').blank
    }
}

如果值得写这个测试是另一个问题......

答案 1 :(得分:1)

这是我以前作为初学者所犯的错误。测试grails是否按预期工作。测试框架相关的东西不是一个好主意。这意味着然后测试所有约束,预定义方法甚至save(),update()等等。这意味着再次测试grails框架而不是开发应用程序。

测试通常应该包括测试与业务逻辑相关的内容。