2011-10-25 39 views
0

我在單元測試中使用兩個mockDomain。當我只啓動一個UT(使用grails test-app -unit MyTest)時,測試通過,但如果我啓動整個測試套件(grails test-app -unit),那麼定義了兩個mockDomain的測試失敗。grails mockDomain()在測試和所有測試套件上運行時的不同行爲

一次啓動一次或整個套件啓動時,測試運行的方式是否有所不同?

我的代碼示例:

void testSaveTranslation_ok() { 

    mockDomain(Translation) 
    mockDomain(HelpSubject, [new HelpSubject(name_fr: "subject")]) 

    assertEquals(1, HelpSubject.count()) 
    HelpSubject helpSubject = HelpSubject.findAll().get(0) 
    assertNull(helpSubject.name) 

    def translation = new Translation(defaultVal:"defaultVal", enVal: "enVal", frVal: "frVal", meta: "helpSubject#name#${helpSubject.id}") 
    assertEquals(0, Translation.count()) 

    translationService.saveTranslation(translation) 
    assertEquals(1, Translation.count()) 

    assertNotNull(helpSubject.name) 
} 

問候,

大衛。

回答

0

我看到一個區別,你是如何模擬翻譯和HelpSubject。

嘗試使用這樣的:mockDomain(翻譯[翻譯])

+0

如果我這樣做(請糾正我,如果我錯了),我的翻譯實例將被保存,以便在斷言(0,Translation.count( )) 將失敗。此測試的關注點是驗證翻譯方法translationService.saveTranslation(translation)有效地保存翻譯。 – David

+0

我認爲你是正確的,但這就是你想要的。在Grails中,您實際上不必調用Domain對象的save()方法。如果你的對象被附加到會話中,參與一個事務並且是骯髒的(或新的),無論你是否調用save(),它都將被持久化。現在你的情況你不關心,你只是想測試saveTranslation(),不管它做什麼。請記住,mockDomain的範圍是有限的,並且不會包含所有的靜態方法,例如,如果需要,你將不得不對meta進行編程。 – dbrin

相關問題