Unit testing 对域类的唯一约束进行单元测试

Unit testing 对域类的唯一约束进行单元测试,unit-testing,grails,Unit Testing,Grails,我使用的是Grails2.4.1,在理解如何正确测试域类上的唯一约束时遇到了困难 我的域类看起来像: 班主任{ String name static constraints = { name( unique: true, blank: false ) } } 还有我的测试: @TestFor(Person) @TestMixin(GrailsUnitTestMixin) class PersonSpec extends Specification {

我使用的是Grails2.4.1,在理解如何正确测试域类上的唯一约束时遇到了困难

我的域类看起来像: 班主任{

    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' )

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

谢谢


--john

我不认为通过触发约束来测试约束是最好的方法。通常我们希望测试我们的代码是否正常工作,而不是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
    }
}

如果值得写的话,测试是另一个问题…

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


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

您可以尝试将两组when-then组合在一起。您也可以尝试在保存一个when-then时进行刷新。one.save(flush:true)谢谢Joe。看起来我也可以刷新第一个实例,即“one.save(flush:true)”您还可以将初始数据传递给mockForConstraintsTests方法,例如mockForConstraintsTests(Person,[new Person(name:'john')]),因为您使用Grails 2.4,所以您有了使用
HibernateTestMixin
的新可能性。它允许您在单元测试中进行完全的Hibernate集成。您不需要模拟域类。请参阅