1

Fooアプリケーションの特定の部分に固有の処理を行いUtil、全体で共有される2つのtaglibがあるとします。私はこのようなことをしたい:

class UtilTagLib {
    def utilTag = { attrs -> 
        ...
    }
}

class FooTagLib {
    def fooTag = {
        ...
        out << g.utilTag(att1: "att1", att2: "att2")
        ...
    }
}

ただし、これを実行して、の単体テストを実行しようとするとfooTag()、次のようになります。

groovy.lang.MissingMethodException:メソッドの署名なし:org.codehaus.groovy.grails.web.pages.GroovyPage.utilTag()は引数タイプに適用可能:(java.util.LinkedHashMap)値:[[att1:att1、att2 :att2]]

UtilTagLib独自の名前空間を付けてみました

static namespace = "util"

呼び出しをに変更します

out << util.utilTag(...)

しかし、これは私を取得します

groovy.lang.MissingPropertyException:そのようなプロパティはありません:クラスのutil:org.example.FooTagLib

おそらく注目すべき点:ログには、次のように表示されます。

警告-「groovyPagesUriService」という名前のBeanがありません。

明らかに、UtilTagLib正しく作成および注入されていません。どうすればこれを修正できますか?

4

2 に答える 2

3

解決策:通話を追加する

mockTagLib UtilTagLib

テストケースのsetUp()(または)メソッドに。@BeforeこれはGroovyPageUnitTestMixinのメソッドであり、直感に反して、指定されたタグライブラリ(モックではなく実際のライブラリ)をインスタンス化し、Grailsアプリケーションコンテキストにワイヤリングします。これは、テスト対象の実際のtaglib(この場合FooTagLib)をセットアップするために内部的に使用されますが、追加のコラボレータータグライブラリをセットアップするためにも機能します。

これは完全ではないことに注意してください。純粋な単体テストというよりも統合テストになります。理想的には、モックUtilTagLibを使用して相互作用をテストするだけです。

于 2012-07-02T19:21:24.537 に答える
1

1つのアプローチは、ラインをリファクタリングすることです。

out << g.utilTag(att1: "att1", att2: "att2")

独自のメソッドに「renderUtilTag(...)」と言ってから、単体テストでそれをモックアウトします。例:

FooTagLib.metaClass.renderUtilTag = { /* something */ }

このようにして、UtilTagLibに依存せずに、単体テストでのみFooTagLibの機能をテストします。

于 2012-06-28T01:04:11.983 に答える