2010-01-06 8 views
6

Tengo un controlador Griales que se basa en el mensaje de taglib para resolver un mensaje de i18n:Cómo se burlan/ramal llamadas a taglib mensaje en el controlador de Grails

class TokenController { 
def passwordReset = { 
    def token = DatedToken.findById(params.id); 
    if (!isValidToken(token, params)) { 
     flash.message = message(code: "forgotPassword.reset.invalidToken") 
     redirect controller: 'forgotPassword', action: 'index' 
     return 
    } 
    render view:'/forgotPassword/reset', model: [token: token.token] 
} 
} 

He escrito una prueba de unidad para el controlador:

class TokenControllerTests extends ControllerUnitTestCase { 

void testPasswordResetInvalidTokenRedirect() { 

    controller.passwordReset() 
    assert... 
} 
} 

Desde el taglib mensaje se llama en el controlador me siento un MissingMethodException:

groovy.lang.MissingMethodException: No signature of method: TokenController.message() is applicable for argument types: (java.util.LinkedHashMap) values: [[code:forgotPassword.reset.invalidToken]]

¿Alguien sabe la mejor manera de evitar este problema en una prueba unitaria? Idealmente, me gustaría realizar afirmaciones sobre el mensaje, pero ahora mismo estaría contento si la prueba acaba de ejecutarse.

Gracias

Respuesta

2

Además de intentar las respuestas anteriores, decidí resolver el mensaje en el gsp y así eliminar la dependencia de la etiqueta lib todos juntos.

Mi código de la clase ahora queda como:

if (!isValidToken(token, params)) { 
    flash.message = "forgotPassword.reset.invalidToken" 

Y en el gsp tengo:

<g:message code="${flash.message}" args="${flash.args}" default="${flash.defaultMsg}"/> 

una solución inspirada en the grails docs

De las respuestas supuesto Derek y de Burt trabajar para todas las bibliotecas de etiquetas, por lo que son soluciones más generales.

+0

I puede añadir esto a tu código: flash.args = [some, args] – Eldelshell

8

Se podría añadir dinámicamente el método que falta en su prueba. No estoy seguro si esto es 100% correcto, pero algo así como ....

void testPasswordResetInvalidTokenRedirect() { 
    controller.metaClass.message = { LinkedHashMap arg1 -> return 'test message output'} 
    controller.passwordReset() 
    assert... 
} 
+0

Gracias Derek, que funciona un convite. Mientras tanto, modifiqué mi código para resolver el mensaje en el gsp, ya que parecía mucho mejor que hacerlo en el controlador. –

+1

lo tanto, si usted hace esto, entonces se hará eco-devuelven el código de mensaje: 'myController.metaClass.message = {args LinkedHashMap -> retorno "$ {} args.code"}' Por ejemplo: 'void testShow_NoSuch() { myController.params.id = 999 modelo def = myController.show() modelo assertNull assertEquals 'default.not.found.message', myController.flash.message }' –

5

Puede cablear utilizando el MetaClass, algo así como:

void testPasswordResetInvalidTokenRedirect() { 

    TokenControllerTests.metaClass.message = { Map p -> return "foo" } 
    controller.passwordReset() 
    assert... 
} 

Esto devuelve el mismo mensaje de siempre (suponiendo realmente no le importa cuál es el valor) pero puede agregar lógica si lo desea, es decir, verificar el valor de 'código' y devolver una cadena correspondiente.

0

Creo que esta es la mejor manera ...

Pon esto en la prueba justo antes de llamar al método controlador:

controller.metaClass.message = { LinkedHashMap key -> assertEquals 'please.create.business', key.code} 
Cuestiones relacionadas