Grails 2.3.4
给定以下域类:
class Player {
String name
static constraints = {
name nullable: false, size: 2..30, unique: true
}
}
运行以下单元测试会产生一些奇怪的行为。
使用shouldFail()进行测试
@Test
void nameUniqueContraint() {
Player player = new Player(name: "John")
Player player2 = new Player(name: player.name)
assert(player.save())
shouldFail(ValidationException) {
player2.save(failOnError: true, flush: true)
fail "FAIL ME"
}
}
测试结果:
grails.validation.ValidationException: Validation error occurred during call to save():
- Field error in object 'moonillusions.sulis.domain.Player' on field 'name': rejected value [John]
使用shouldFail()和catch进行测试
@Test
void nameUniqueContraint1() {
Player player = new Player(name: "John")
Player player2 = new Player(name: player.name)
assert(player.save())
shouldFail(ValidationException) {
try {
player2.save(failOnError: true, flush: true)
fail "FAIL ME"
}catch(ValidationException e) {
fail "CATCHED "
}
}
}
测试结果:
junit.framework.AssertionFailedError: CATCHED
使用catch进行测试
@Test
void nameUniqueContraint2() {
Player player = new Player(name: "John")
Player player2 = new Player(name: player.name)
assert(player.save())
try {
player2.save(failOnError: true, flush: true)
fail "FAIL ME"
}catch(ValidationException e) {
fail "CATCHED "
}
}
测试结果:
junit.framework.AssertionFailedError: FAIL ME
对我来说,这些结果没有任何意义。 shouldFail()似乎不符合我们的预期(测试1),并且还会影响代码内的try块(测试2)。
最佳答案
此行为某种程度上与示例中第一个“玩家”的刷新有关。当第二名玩家被冲洗时,第一名玩家的冲洗可能正在发生。因此,据我所知,它将导致两个验证异常发生。
解决方案是在测试开始时冲洗第一位玩家。
@Test
void nameUniqueContraint() {
Player player = new Player(name: "John")
Player player2 = new Player(name: player.name)
assert(player.save(failOnError: true, flush: true))
shouldFail(ValidationException) {
player2.save(failOnError: true, flush: true)
}
}
关于unit-testing - Grails单元测试应该失败奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20446092/