2012-07-17 9 views
5

Estoy tratando de usar findOrCreateBy para buscar un objeto o crear una instancia si no puedo encontrar uno que coincida, pero no está funcionando como esperaba.¿FindOrCreateBy funciona con otras instancias de dominio?

Esto es lo que tengo:

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 

¿Qué estoy haciendo mal? ¿Por qué el fooType no está configurado correctamente? ¿Es este comportamiento esperado o es esto un error en Grails?

+0

Bueno, puede ser tonto, pero desde su base de datos está vacía, FooType.findByName ("grande") devolverá un valor nulo, ¿verdad? Y luego creas un objeto pasando este atributo nulo. Entonces, sí, myFoo.fooType realmente debe ser nulo en este caso. –

+0

@TiagoFarias, actualicé la pregunta para ser más correcto en este punto. Los FooTypes se inicializan en el DB, por lo que no están realmente vacíos, pero no hay objetos Foo en el DB. Cuando se llama a 'findOrCreate *', 'myFooType' es una instancia persistente de' FooType'. – cdeszaq

Respuesta

1

No estoy seguro, pero parece que está intentando hacer esto como una prueba. (basado en su afirmación)

Los métodos dinámicos agregados por el framework Grails no están disponibles en las pruebas unitarias a menos que se burle de la clase de dominio. Ahora bien, este es el código griales viejos tomado de otra Question site pero puede ayudar

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

Las afirmaciones solo están ahí para mostrar el problema. Esto es en realidad código de un servicio, por lo que todos los bits y bobs GORM están ahí, pero 'findOrCreateBy *' simplemente no funciona correctamente. Gracias sin embargo. – cdeszaq

Cuestiones relacionadas