2011-03-22 4 views
1

컨트롤러 용 통합 테스트 케이스를 만들려고하는데 테스트중인 컨트롤러의 뷰 이름을 얻어야한다.Grails가 컨트롤러 뷰를 얻는다

controller?.modelAndView?.getViewName() 

를하지만의 ModelAndView 객체가 null :

나는 이런 식으로 할 노력하고있어. 컨트롤러 개체가 null이 아니며 다른 테스트를 통과했습니다.

왜 내가 modelAndView를 얻고 있는지에 대한 아이디어가 있습니까? 내가 찾은 것으로부터 컨트롤러의 뷰 이름을 얻는 방법입니다.

도움 주셔서 감사합니다.

답변

0

컨트롤러 작업 메서드가 실행 된 후 통합 테스트에서 모델을 가져와야 할 때까지 비슷한 문제가 발생했습니다. 그래서 컨트롤러에서 렌더링 메서드를 변경하여 맵을 가져올 수있었습니다 그것은 모형을 얻을 수 있기 위해 그것으로 전달됩니다. 그래서와

def someObject = renderMap.model.someObject 

: 그래서 나는

Map renderMap 

registerMetaClass(MyController.class) 
MyController.metaClass.render = {Map m -> 
    renderMap = m 
} 
... 
// Instantiate controller 
// Call controller action 

그럼 내가 이런 모델에서 설정 한 일부 개체에 액세스 할 수있었습니다했다 년 후, renderMap라는 시험 방법의 변수를했다 이 작업을 수행 할 수 있어야합니다 :

String view = renderMap.view 

컨트롤러의 메타 클래스를 원래대로 복원하는 것이 좋습니다.

+0

피드백에 감사드립니다. 나는 컨트롤러가 다른 테스트 케이스에서 잘 작동하기 때문에 이것이 나의 경우는 아니라고 생각한다. 문제는지도 (params)에 id를 수동으로 넣어 도메인 클래스의 새 인스턴스를 만들어야한다는 것이 었습니다. Grails의 이전 버전에서는 훌륭하게 작동했지만 1.3.5에서는 작동하지 않았습니다. 내 솔루션을 게시 할게. – Arturo

0

는 테스트 케이스는 Grails의 이전 버전에서 작동하지만이 작동하지 않는 1.3.5 이후,이 같은 PARAMS에 record.id을 추가하기 위해 줄을 추가했다 :

void testUpdateSaveError(){ 

    recordWrongParams.each{key, value-> 
     controller.params.put(key,value) 
    } 
    controller.params.put("id", record.id)  
    controller.update()   

    assertEquals controllerPath + "/edit", controller?.modelAndView?.getViewName()  
} 

후 그것은 작동 중임

관련 문제