2012-08-29 3 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) 

그러나,이 작동하지 않습니다

기본적으로 내가 STH 좋아하지 않는 단위 테스트를 작성하려면 , CannotRedirectException이 발생합니다.

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

이에 대한 제안 된 솔루션 (여러 곳에서 발견) 인 : 메시지와 함께 그러나

redirectArgs.clear() 

,이 때문에 Grails는이 때문에 작동하지 않습니다, 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

관련 문제