我正在尝试编写一些单元测试来验证命令对象。当我的命令对象有很多字段和很多验证规则时,为每个测试用例设置命令对象会变得过于冗长和重复。
比方说我有这样的命令对象:
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()时,将使用所有约束,即使在测试头衔“Mr”的情况下也会导致验证错误。我可以为这一次测试设置姓名和电话,但在测试姓名验证时,我需要设置头衔和电话,和姓名。您可以想象,当命令对象的字段越多,规则越复杂时,这会变得越麻烦。
在Grails的单元测试(使用Spock)中,有没有办法禁用约束?
如果没有,对这种情况有什么其他建议吗?
- 谢谢-谢谢
2条答案
按热度按时间soat7uwm1#
您不能禁用特定的约束验证。但是,您可以为其余属性提供有效值,或者特别是检查
title
属性中的错误。在第一种情况下,您只需创建一个具有默认(和有效)属性的Map,并从这些属性初始化您的命令:
有一个“基线”案例进行验证也是一个很好的实践(我在测试中总是遵循这个模式),它表达了关于验证的基本假设。
对于另一种可能性,您可以:
5anewei62#
通过传递一个数组作为参数,并将其名称作为String,可以只测试所需的属性: