jon*_*bot 4 testing grails plugins integration-testing unit-testing
我有一个自定义taglib需要调用服务方法,而该方法又使用Wslite插件来发送和接收SOAP消息.taglib看起来像这样.
class myTagLib {
def myService
def thisTag = {
def parametersFromService = myService.method("argument")
out << render(template:'/myFolder/myView',
model:parametersFromService)
}
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试为这个taglib构建一个测试.我的测试是这样的:
void testThisTag() {
def appliedTagLib = applyTemplate('<thisTag attr="value" />')
def parametersFromService = myService.method("argument")
def renderedTemplate = render(template:'/myFolder/myView',
model:parametersFromService)
assertEquals appliedTagLib, renderedTemplate
}
Run Code Online (Sandbox Code Playgroud)
我开始把它写成单元测试.我尝试了简单的MockFor(MyService)
注释,以及以更精细的方式模拟它们,但是myService
当taglib试图调用它时,对象总是为null.
鉴于此,我决定最好将其作为集成测试; 这将让我访问插件和服务,没有问题.
但是,只有在测试类扩展GroovyPagesTestCase时,applyTemplate方法才有效.如果你这样做,渲染方法不起作用,至少不在集成测试中.我知道ApplyTemplate在和渲染做对方一起工作,在单元测试的标签库,因为我测试过的其他标签库这样.
我好像在一块岩石和一块坚硬的地方之间.要访问他们调用的服务,插件和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
Run Code Online (Sandbox Code Playgroud)
...
def pageRenderer
Run Code Online (Sandbox Code Playgroud)
...
void setUp() {
context = grailsApplication.mainContext
taglib = context.getBean(myTagLib.class.name)
pageRenderer = new PageRenderer(new GroovyPagesTemplateEngine(context.getServletContext()))
}
Run Code Online (Sandbox Code Playgroud)
但收到此错误:
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)
Run Code Online (Sandbox Code Playgroud)
我几天前在类似的东西上挣扎,这就是我解决它的方法:
grailsApplication.mainContext.getBean
就是这样!:)
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()
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2868 次 |
最近记录: |