domingo, 15 de noviembre de 2009

Test de integración, recuperar las variables devueltas en el model

Para poder recuperar las variables que un Controller pone en el modelo desde un test de integración, puedes seguir el siguiente truco. Básicamente le dices que los valores que se rellenan en el render, los copie a un Map definido en el propio test de integración. Una vez invocado el controller, solo hay que acceder a dicho Map.

class FooController {
def bar = {
render(view:"baz", model:[foo:"bar"]
}
}
class FooControllerTests extends GrailsUnitTestCase {
def renderMap

protected void setUp() {
super.setUp()
FooController.metaClass.render = {Map map -> //Esto es para acceder al modelo cuando el view o template se renderiza
renderMap = map
}
}
void testBar () {
def controller = new FooController()
controller.bar()
assert renderMap.model.foo == "bar"
assert renderMap.view == "baz"
}
}

domingo, 1 de noviembre de 2009

Introspección y GroovyClassLoader

Varios truqitos en uno para cuando en algun sitio configureis el nombde de la clase con la que se ha de trabajar y tengais que usarla:



class CosasRarasTests extends GrailsUnitTestCase {

def sessionFactory

protected void setUp() {
super.setUp()
}

protected void tearDown() {
super.tearDown()
}

void testSomething() {
GroovyClassLoader classLoader = new GroovyClassLoader()


String domainClass = "User"
String enabledFieldName = "enabled"
String usernameFieldName = "username"
String passwordFieldName = "password"
def user = classLoader.loadClass(domainClass).newInstance()
user."$usernameFieldName" = "a"
user."$passwordFieldName" = "12345"
user."$enabledFieldName" = true

sessionFactory.currentSession.save(user)


println User.findAll().size()

}
}




Se usa la inyección del sessionFactory debido a que el classLoader parece que no carga la clase proxy creada por GORM, sino solamente la entidad mapeada.