我使用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' )
}
尽管显然违反了唯一约束,但第二个实例正在验证。有人可以解释一下这里发生了什么,以及我该如何最好地纠正它?
谢谢!
- 约翰
答案 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框架而不是开发应用程序。
测试通常应该包括测试与业务逻辑相关的内容。