3

我有一个与这个问题中描述的问题非常相似的问题。(主要区别在于我使用的是 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)

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

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()

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

4

1 回答 1

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)
于 2012-08-29T13:29:09.793 回答