unit-testing - Grails单元测试应该失败奇怪的行为

标签 unit-testing validation grails constraints

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/

相关文章:

reactjs - ReactWrapper::state() 只能在类组件 Unit Testing Jest 和 Enzyme 上调用

java - PowerMockito 正在调用真实方法而不是模拟私有(private)方法

xml - Powershell XML 验证

grails - Grails maxRows/queryTimeout警告

android - 如何对蓝牙配件进行单元测试?

java - 单元测试同步

django - 如何测试登录过程?

c# - ASP.NET 客户端验证与服务器端验证

grails - Grails + Selenium + EasyB + spring-security-core:ifAnyGranted无法正常工作

java - 将 Groovy 集成到现有的 Web 应用程序中