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