2012-07-17 87 views
5

我試圖用findOrCreateBy來搜索一個對象或者實例化一個對象,如果我找不到一個匹配的對象,但它不能像我期望的那樣工作。findOrCreateBy是否可以與其他域實例一起使用?

這是我有:

String myBaz = "some unique string" 
FooType myFooType = FooType.findByName("Large") 

// The Foo table is empty, so this should give me a new Foo 
Foo myFoo = Foo.findOrCreateByBazAndFooType(myBaz, myFooType) 

assert myFoo.baz == myBaz 
assert myFoo.fooType == myFooType // Fails because myFoo.fooType is null, 
// but should be set to myFooType 

我在做什麼錯?爲什麼fooType未正確設置?這是預期的行爲還是Grails中的一個錯誤?

+0

嗯,這可能是愚蠢的,但由於你的數據庫是空的,FooType.findByName(「大」)將返回null,對不對?然後你創建一個傳遞這個空屬性的對象。所以,是的,在這種情況下,myFoo.fooType必須爲真。 – 2012-07-17 17:09:50

+0

@TiagoFarias,我更新了這個問題,在這一點上更正確。 FooType被引導到數據庫中,所以它不是真的空,但是DB中沒有Foo對象。當調用'findOrCreate *'時,'myFooType'是'FooType'的一個持久實例。 – cdeszaq 2012-07-17 17:15:25

回答

1

我不確定,但它看起來像你試圖做這個測試。 (基於你的斷言)

除非你模擬域類,否則在單元測試中不能使用由Grails框架添加的動態方法。現在,這是從另一個Question site採取舊Grails的代碼,但它可以幫助

import grails.test.GrailsUnitTestCase 

class MessageControllerTests extends GrailsUnitTestCase { 

    def savedMessages 

    void setUp() { 
     super.setUp() 
     savedMessages = [] 
     mockDomain(Message, savedMessages) //mocking the domain class 
     mockController(MessageController) //mocking the controller 
    } 

    void testMessageCanBeCreated() { 
     def messageController = new MessageController() 
     messageController.params.title = 'detail' 
     messageController.params.detail = 'some detail' 

     messageController.save() // executing the save action on the MessageController 

     assertEquals('list', messageController.redirectArgs.action) 
     assertEquals(1, savedMessages.size()) //assert the message has been saved 
    } 
} 
+0

斷言僅在那裏顯示問題。這實際上是來自服務的代碼,所以所有的GORM位和bob都在那裏,但'findOrCreateBy *'只是不能正常工作。不過謝謝。 – cdeszaq 2012-07-17 18:36:15

相關問題