2012-08-29 40 views
3

我有一个非常类似于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() 

样的作品,它让我调用另一个动作,但它似乎撤销/回滚所做的更改通过之前的行动,这正是我想要避免的(如果我想这样做,我会把这个调用放到它自己的测试中[方法])。

回答

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) 
+0

不错,你基本上是正确的,我没有解释,在我的问题,编辑它澄清。不管怎么说,还是要谢谢你! – NoUsername

+0

好吧,我编辑了我的答案。我不测试,只是猜测。请告诉我,如果它的工作。 –

+0

该死的,我几乎可以肯定,这将工作(从代码判断),但它产生了相同的结果作为response.reset(),这意味着它从controller.save()(添加一个对象实例)撤消,这至少是一个意想不到的行为。 感谢您的建议。 – NoUsername