2013-12-07 33 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) 
    } 
}