2013-12-07 2 views
2

Grails 2.3.4Grails shouldFail странное поведение

Учитывая следующий класс домена:

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() и поймать

@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

Тестирование настраивайте

@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) внутри кода.

+0

Я испытываю подобную вещь на 2.3.5. Кажется, что shouldFail запускает код, предоставленный после завершения без исключения. Что приводит к простому исключению первоначального исключения без какой-либо специальной обработки. Вы нашли решение для этого? – amit

+0

Что такое родительский класс вашего теста? –

ответ

0

Такое поведение как-то связано с промывкой первого «игрока» в примере. Вероятно, покраснение для первых игроков происходит, когда второй игрок покраснел. Таким образом, по моему мнению, это приведет к двум исключениям проверки.

Решение должно было очистить первого игрока в начале теста.

@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) 
    } 
} 
Смежные вопросы