我正在尝试为 Command 对象验证编写一些单元测试。当我的命令对象有许多具有许多验证规则的字段时,为每个测试用例设置命令对象变得过于冗长和重复。
假设我有这个命令对象:
class MemberCommand {
String title
String name
String phone
static constraints = {
title(blank: false, inList: ["Mr", "Mrs", "Miss", "Ms"])
name(blank: false, maxSize:25)
phone(blank: false, matches: /\d{8}/)
}
}
我想通过做这样的事情来测试这个:
class ValidationTitle extends UnitSpec {
def "title must be one of Mr, Mrs, Miss, Ms"() {
setup:
def memberCommand = new MemberCommand()
// I don't want to do:
// memberCommand.name = "Spock"
// memberCommand.phone = "99998888"
// Instead, I want to disable other constraints, except the one for title
mockForConstraintsTests MemberCommand, [memberCommand]
when:
memberCommand.title = t
then:
memberCommand.validate() == result
where:
t << ["Mr", "Mrs", "Miss", "Ms", "Dr", ""]
result << [true, true, true, true, false, false]
}
}
此测试将失败,因为当调用 memberCommand.validate() 时,将使用所有约束,并且即使在测试标题“先生”的情况下也会导致验证错误。我可以为这个测试设置名称和电话,但是,我需要在测试名称验证时设置标题和电话,以及在测试电话验证时设置标题和名称。您可以想象,当命令对象有更多字段且规则更复杂时,这会变得更加烦人。
有没有办法在 grails 中禁用单元测试(使用 Spock)中的约束?
如果没有,对于这种情况还有其他建议吗?
谢谢你。