2013-12-07 2 views
2

Grails는 다음과 같은 도메인 클래스 감안할 때Grails는 단위 테스트가 이상한 행동을

2.3.4 shouldFail. 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

,174,515 캐치에게

@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) 
    } 
}