2007年5月9日水曜日

0.5 で test が error

0.5 に移行してから % grails test-app すると,



Error running tests: org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [Foo#1]



などと言われることがある. テストの中でデータベースを更新したりしている場合ね.



こんなときには ${GRAILS_HOME}/scripts/TestApp.groovy の 162 ~164 行目



app.domainClasses.each { dc ->

dc.clazz.executeUpdate("delete from ${dc.clazz.name}")

}




をコメントアウトすると, とりあえず上記のエラーは出なくなるはず. このコードはテストメソッド終了時にデータベースをクリーンアップしているのだけど, 消すには消す順序ってぇものがあるわけで, それを無視して適当に消しているのがまずいわけだ.



一方でこの修正を入れるとクリーンアップを自動でしなくなるので, データベースの中身は tearDown() 辺りでちゃんと消しておかないと, 前のテスト・メソッドの影響が残ってしまうということになるのじゃね.



http://www.nabble.com/Unit-tests-and-GORM-%28Hibernate%29-tf3697726.html