2009-06-11 6 views
7

Grails 1.1. Mon étiquette personnalisée: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] 
    ]) 
} 

À peu près tous les tests unitaires taglib je vois juste

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

Est-il possible de tester ce modèle correct est en cours de rendu avec les valeurs correctes dans le modèle?

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 
    } 
} 

}

Répondre

6

Avec TagLibUnitTestCase vous pouvez utiliser renderArgs pour tester les appels à la méthode render de la même façon que vous pouvez en ControllerUnitTestCase. La propriété renderArgs est simplement une carte qui stocke les arguments du dernier appel à la méthode dynamique render. Donc, dans votre exemple, vous voulez quelque chose comme ceci:

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

et ainsi de suite.

+0

J'ai dû utiliser tagLib.renderArgs pour que cela fonctionne. (Grails 1.3.7) –