2009-06-11 17 views
7

Grails 1.1。 マイカスタムタグ: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] 
    ]) 
} 

ちょうど約すべて私はちょうど

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

を参照のtaglib単体テストのは、正しいテンプレートをモデルに正しい値でレンダリングされていることをテストすることが可能ですか?

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

} TagLibUnitTestCase

答えて

6

あなたはrenderメソッドを使用すると、ControllerUnitTestCaseにできるのと同じ方法で呼び出しをテストするためにrenderArgsを使用することができます。 renderArgsプロパティは、render動的メソッドへの最後の呼び出しの引数を格納する単なるマップです。したがって、あなたの例では、次のようなものが欲しいでしょう:

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

などです。

+0

これを動作させるには、tagLib.renderArgsを使用する必要がありました。 (Grails 1.3.7) –