2012-07-17 15 views
5

findOrCreateBy Bir nesneyi aramak veya eşleşen bir tane bulamıyor, ancak beklediğim gibi çalışmıyor bir örneği aramak için kullanmaya çalışıyorum. Neyi yanlış yapıyorumOrCreateBy, diğer etki alanı örnekleriyle birlikte çalışır mı?

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 

:

Bu benim ne var? fooType neden uygun şekilde ayarlanmıyor? Bu beklenen davranış mı yoksa Grails'deki bir hata mı?

+0

yardımcı olabilir, aptalca olabilir ama? Daha sonra bu boş özniteliği geçen bir nesne oluşturursunuz. Yani, evet, bu durumda benimFoo.fooType gerçekten boş olmalıdır. –

+0

@TiagoFarias, Bu noktada daha doğru olması için bu soruyu güncelledim. FooTypes, DB'ye önyüklenir, bu yüzden gerçekten boş değil, ancak DB'de Foo nesneleri yok. 'FindOrCreate *' çağrıldığında, 'myFooType'' FooType'ın kalıcı bir örneğidir. – cdeszaq

cevap

1

Emin değilim, ama bunu bir test olarak yapmaya çalışıyormuşsunuz gibi görünüyor. (assert'inize dayanarak)

Grails framework tarafından eklenen dinamik yöntemler, domain sınıfıyla dalga geçmediğiniz sürece birim testlerinde kullanılamaz. Şimdi bu başka Question site alınan eski grails kod ama veritabanı FooType.findByName, boş olduğundan ("Large") doğru, boş dönecektir o Eh

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

Buradaki sorular sadece sorunu göstermek için orada. Bu aslında bir hizmetin kodudur, yani tüm GORM bitleri ve boblar var, ama 'findOrCreateBy *' sadece doğru çalışmıyor. Yine de teşekkürler. – cdeszaq

İlgili konular