2011-08-05 44 views
4

我正在爲一些簡單的方法編寫單元測試。我遇到的問題是'保存'不適用於我的域對象,即使該域應該被嘲弄。當在域對象上調用驗證時,它返回爲true。我甚至用try/catch來包圍這個對象,以確保它沒有拋出任何奇怪的錯誤,但事實並非如此。以下代碼用於調用和測試。Grails mockDomain保存不保存

void test() 
{ 
    mockDomain(MyDomain) 
    Map map1= ["asdf":" "] 
    Map map2 = ["asdf":123] 
    InputObject input = new InputObject() 
      input.setForeignId("1") //not a constraint 
    input.setMap1(map1) 
    input.setMap2(map2) 
    service.methodUnderTest(profile) 
    List list = MyDomain.getAll() 
    assertEquals 1, l.size() //FAILS 
} 

def persistPublishGuids(InputObject input) 
{ 
    try{ 
    HashMap map1 = input.map1 
    for (e in map1) 
    { 
     String key= e.getKey() 
     String value = e.value 
     long size = input.map2.get(key) 
     MyDomain domain = new MyDomain (id:guid, field1:value, field2:input.foreignId, field3:size) 
     domain.save() 
    } 
    } catch(ex) 
    { 
     ex.printStackTrace() 
    } 
} 
+3

它如果這是[sscce](http://sscce.org/),可能會有所幫助。你發佈的內容不能單獨運行。嘗試製作一個最簡單的例子,它將執行並重現問題併發布。這樣做可能會發現問題的根源,如果不是的話,您將有更清晰的例子供人幫助。 – ig0774

+0

我會,但我知道了。需要運行grails clean,然後在STS中清理/重建項目。我只發現了這一點,因爲當我今天早上開始寫另一個測試時,它聲稱我的一個域對象上沒有方法「save()」。谷歌搜索導致我清潔和重建解決方案。 – Joseph

回答

1

問題是,grails應用程序需要清理和項目重建。

+0

這是Grails的瘟疫......我花了更多的時間清理/編譯比編碼的東西... GrrrRails。 – Guillaume

+0

我在這個年齡段沒有遇到過這個問題。你必須有一個安裝問題。 – Joseph

+0

我在一般情況下說:'clean'grails與windows重啓有點相似......它可以治癒幾乎所有奇怪的行爲...... – Guillaume

4

我還建議在測試中保存域對象時,將flush和failOnError標誌設置爲true。 'flush:true'確保對象立即保存。沒有failOnError驗證錯誤將意味着該對象不會被保存,這很容易被忽略。

domainObject.save(flush:true, failOnError: true) 

這也是值得考慮的驗證標誌設置爲false,如果你不想在測試的所有字段設置基礎數據

domainObject.save(validate: false)

Grails domain object save docs for full information