单元测试控制器通过调用多个动作

时间:2012-08-29 13:23:52

标签: unit-testing grails grails-2.0 grails-controller

我遇到与this question中描述的问题非常类似的问题。 (主要区别在于我使用的是Grails 2.1)。

基本上我想编写一个类似测试的单元测试:

// set params so i can create an obj.
def results = controller.save()

// validate results or model/view
results = controller.edit(id, version)

但是,这不起作用,因为第一个方法操作(保存)触发了重定向,第二个方法也是,这导致了CannotRedirectException。 随着消息:

Cannot issue a redirect(..) here. A previous call to redirect(..) has already redirected the response.

建议的解决方案(在不同的地方找到)是:

redirectArgs.clear()

但是,这不起作用,因为Grails 2,redirectArgs不存在,只有

response.redirectUr

只能读取,不能写入。

我也已经尝试过这些东西(各种组合):

response.reset()
clearGrailsWebRequest()
bindGrailsWebRequest()
cleanupGrailsWeb()
controller.redirect([:])
controller.redirect(null)
controller = new OfferObjectController()
controller = mockController(OfferObjectController)

一切都没有运气。

我完全没有想法还有什么可以工作/帮助。 任何建议表示赞赏!

====编辑====

我忘了澄清那个

response.reset()

有点工作,它让我调用另一个动作,但它似乎撤消/回滚前一个动作所做的更改,这正是我想要避免的(如果我想要的话,我会将调用放入其中自己的测试[方法])。

1 个答案:

答案 0 :(得分:4)

答案是

response.reset()

我不知道为什么你会收到这个例外。顺便说一句,你应该创建一个任务一个测试。

我想你可以试试这个:

import org.codehaus.groovy.grails.web.servlet.mvc.GrailsWebRequest
.....

// set params so i can create an obj.
def results = controller.save()

def lastRequest = GrailsWebRequest.lookup().currentRequest
lastRequest.removeAttribute("org.codehaus.groovy.grails.REDIRECT_ISSUED")

// validate results or model/view
results = controller.edit(id, version)