4

サービス メソッドを呼び出す必要があるカスタム taglib があります。サービス メソッドは、Wslite プラグインを使用してSOAP メッセージを送受信します。taglib はこんな感じです。

class myTagLib {
    def myService
    def thisTag = {
        def parametersFromService = myService.method("argument")
        out << render(template:'/myFolder/myView',
        model:parametersFromService)
    }
}

このタグライブラリのテストを構築しようとしています。私のテストは次のようなものです:

void testThisTag() {
    def appliedTagLib = applyTemplate('<thisTag attr="value" />')
    def parametersFromService = myService.method("argument")
    def renderedTemplate = render(template:'/myFolder/myView',
        model:parametersFromService)
    assertEquals appliedTagLib, renderedTemplate
}

これを単体テストとして書くことから始めました。私は単純なMockFor(MyService)注釈を試し、より精巧な方法でそれらをモックしましたmyServiceが、taglib がそれを呼び出そうとしたとき、オブジェクトは常に null でした。

そのため、これを単純に統合テストとして行うのが最善であると判断しました。これでプラグインとサービスにアクセスできるようになりますが、問題ありません。

ただし、applyTemplate メソッドは、テスト クラスが GroovyPagesTestCase を拡張する場合にのみ機能します。ただし、それを行う、render メソッドは機能しません。少なくとも統合テストでは機能しません。この方法で他のtaglibをテストしたので、applyTemplateとrenderがtaglibの単体テストで互いに連携して動作することを知っています。

私は岩と固い場所の間にいるようです。サービス、プラグイン、およびそれらが呼び出す SOAP サービスにアクセスするには、統合テストが必要です。applyTemplate() メソッドを使用するには、GroovyPagesTestCase を拡張する必要がありますが、それによって render メソッドが機能しなくなります。テスト クラスに追加import grails.test.GroovyPagesTestCaseしてから、そのクラスから applyTemplate メソッドを呼び出してみましたが、メソッドの例外が見つかりません。

考え?

Grails のバージョンは 2.0.1 ですが、問題がなければ 2.2.1 にアップグレードできます (私たちのサイトは移行中です)。

---補遺----- elias は、grails.gsp.PageRenderer のインスタンスを挿入して、機能するレンダリング メソッドを取得できると提案しました。私はそれを構築しようとしました:

import org.codehaus.groovy.grails.web.pages.GroovyPagesTemplateEngine
import grails.gsp.PageRenderer

...

def pageRenderer

...

void setUp() {
    context = grailsApplication.mainContext
    taglib = context.getBean(myTagLib.class.name)
    pageRenderer = new PageRenderer(new GroovyPagesTemplateEngine(context.getServletContext()))
}

しかし、このエラーを受け取ります:

java.lang.NullPointerException: Cannot invoke method findTemplateByPath() on null object
at grails.gsp.PageRenderer.renderViewToWriter(PageRenderer.groovy:120)
at grails.gsp.PageRenderer.render(PageRenderer.groovy:77)
at MyTagLibIntegrationTests.testThisTag(MyTagLibIntegrationTests.groovy:37)
4

3 に答える 3

6

私は数日前に似たようなことに苦労していましたが、これが私がそれを解決した方法です:

  1. 統合テストのようにテストを維持します (何も拡張する必要はありません)
  2. taglib Bean のインスタンスを取得しますgrailsApplication.mainContext.getBean
  3. メソッド呼び出しを使用してテストする

以上です!:)

class MyTagLibTests {
    def grailsApplication
    def taglib

    @Before
    void setUp(){
        // grab the taglib instance from Spring context
        taglib = grailsApplication.mainContext.getBean(MyTagLib.class.name)
    }

    @Test
    void myTestAboutThisTag() {
        def thisTagArgs = [:] // set up the arguments here
        assert 'shouldResultThis' == taglib.thisTag(thisTagArgs).toString()
    }
}
于 2013-06-14T17:12:33.543 に答える
1

したがって、私が最終的に行ったのは、applyTemplate を取得するために GroovyPagesTestCase を拡張し、次に groovyPageRenderer をエリアスが提案したように注入することでした。Persnickity の注意: スプリングが適切な配線をすべて行うには、注入された PageRenderer groovyPageRenderer を呼び出す必要があります。したがって、私のテストクラスは最終的に次のようになりました。

class myTaglibIntegrationTests extends GroovyPagesTestCase {
    PageRenderer groovyPageRenderer 
    def imageService
    @Test
    void testThisTag() {
        def appliedTagLib = applyTemplate('<thisTag attr="value" />')
        def parametersFromService = myService.method("argument")
        def renderedTemplate = groovyPageRenderer.render(template:'/myFolder/myView',
            model:parametersFromService)
        assertEquals appliedTagLib, renderedTemplate
    }
}
于 2013-06-14T20:03:29.420 に答える
0

よりクリーンなソリューションは、既に render メソッドが含まれているため、GroovyPageUnitTestMixin を使用します。

@grails.test.mixin.TestMixin(grails.test.mixin.GroovyPageUnitTestMixin)
class myTaglibIntegrationTests {

    def myService

    @Test
    void testThisTag() {
        def appliedTagLib = applyTemplate('<thisTag attr="value" />')
        def parametersFromService = myService.method("argument")
        def renderedTemplate = render(template:'/myFolder/myView', 
                                      model:parametersFromService)
        assertEquals appliedTagLib, renderedTemplate
    }
}

いくつかの簡単な taglib テストに関する優れた記事がここにあります: http://mrhaki.blogspot.com/2013/05/grails-goodness-testing-views-and.html

于 2013-08-28T19:49:31.913 に答える