2009-06-11 15 views
7

Grails 1.1. mio tag personalizzato:Testing grails taglib

class MyTagLib { 
    static namespace 'ct' 
    def textField = {attrs -> 
    def bean = attrs.remove('bean') 
    def field = attrs.remove('field') 
    attrs.name = field 
    out << render(template:"/templates/textField", model:[ 
     required: !bean.constraints[field].nullable, 
     display : bean["${bean.trainingExperience.type}"][field], 
     theTag : g.textField(name : field, value : bean[field]), 
     value : bean[field] 
    ]) 
} 

Quasi tutti i test di unità taglib vedo solo

AssertEquals "Some String", taglib.out.toString() 

E 'possibile verificare che la corretta modello viene reso con i valori corretti del modello?

MyTagLibTests

public class CareertracTagLibTests extends TagLibUnitTestCase{ 
    protected void setUp() { 
    super.setUp() 
    mockTagLib(FormTagLib) 
    mockTagLib(RenderTagLib) 
    def g = new FormTagLib() // interpret "g" namespace as instances of FormTagLib 
    tagLib.metaClass.g = g 
    String.metaClass.encodeAsHTML = {org.codehaus.groovy.grails.plugins.codecs.HTMLCodec.encode(it)} 
    } 
    void TestTextField() { 
    tagLib.textField([bean : mockBean, field : 'viewField']) 
    def x = new RenderTagLib().render(template:"/templates/textField", 
     model:[required:false, 
       display:"view", 
       // Snip 
      ]) 
    assertEquals tagLib.out, x.out // Or something like this 
    } 
} 

}

risposta

6

Con TagLibUnitTestCase è possibile utilizzare renderArgs per testare le chiamate al metodo render stesso modo in cui è possibile in ControllerUnitTestCase. La proprietà renderArgs è semplicemente una mappa che memorizza gli argomenti dell'ultima chiamata al metodo dinamico render. Quindi, nel tuo esempio vorresti qualcosa del genere:

assertEquals "/templates/textField", renderArgs.template 
assertFalse renderArgs.model.required 

e così via.

+0

Ho dovuto usare tagLib.renderArgs per farlo funzionare. (Grails 1.3.7) –