2012-07-18 3 views
3

I는 JSON 응답에 도메인 클래스를 렌더링하는 Grails의 컨트롤러 유닛 테스트를 쓰고 ControllerUnitTestCase의 도메인 객체 실패 도메인 개체 :JSON 렌더링

class MyControllerTests extends ControllerUnitTestCase { 
    @Before 
    void setUp() { 
     super.setUp() 
     mockDomain(MyDomainClass, [new MyDomainClass(id: 7)]) 
    } 

    @Test 
    void testFind() { 
     def inst = MyDomainClass.get(7) 
     controller.params.id = inst.id 
     controller.find() 
     assert(controller.response.json.data.id == inst.id) 
    } 

모두가 불쾌한 스택 추적을 토해내 json으로 렌더링을 제외하고 잘 작동하는 것 같군이 :

| Failure: testFind(MyControllerTests) 
| org.apache.commons.lang.UnhandledException: 
     org.codehaus.groovy.grails.web.converters.exceptions.ConverterException: Error converting Bean with class MyDomainClass 
     Caused by: org.codehaus.groovy.grails.web.converters.exceptions.ConverterException: Error converting Bean with class MyDomainClass 
at grails.converters.JSON.value(JSON.java:199) 
at grails.converters.JSON.convertAnother(JSON.java:162) 
at grails.converters.JSON.value(JSON.java:199) 
at grails.converters.JSON.render(JSON.java:134) 
... 5 more 
     Caused by: java.lang.reflect.InvocationTargetException 
... 9 more 
     Caused by: groovy.lang.MissingMethodException: No signature of method: MyDomainClass.isAttached() is applicable for argument types:() values: [] 
     Possible solutions: isAttached(), attach() 
... 9 more 
를 지도 대신 도메인 클래스에 반환을 변경

작동 : 도메인 클래스에 죽을 JSON 마샬의 원인은 무엇

render ([data: [id: domainInst.id]] as JSON) 

? 그것은 정상적인 환경에서 작동하지만 모의 테스트 환경에서는 작동하지 않습니다. 이 테스트를 수행 할 수있는 방법이 있습니까?

+0

해결 방법으로 내 대답보기 - 향후 버전에서 해결할 요청을 열었습니다. –

답변

1

변환기를 사용하여 도메인 클래스를 JSON 객체로 렌더링하려고한다는 것을 깨닫게하려면 미세 조정이 필요합니다. 이것은 특별한 ObjectMarshaller를 거쳐야하는 Grails 도메인 클래스 대신 Map 객체로부터 응답을 렌더링하기 때문에 수동으로 ID를 맵에 넣을 때 작동합니다. 이 같은

뭔가 :이 도움이

// Domain Class 
class Foo { 
    String foo 
} 

// Controller class 
class MyController { 
    def find = { 
     def domainInst = Foo.get(params.id) 
     render domainInst as JSON 
    } 
} 

// Controller Test Class 
class MyControllerTests extends ControllerUnitTestCase { 

    static application 

    @Before 
    void setUp() { 
     super.setUp() 

     // Register some common classes so that they can be converted to XML, JSON, etc. 
     def convertersInit = new ConvertersConfigurationInitializer() 
     convertersInit.initialize(application) 
     [ List, Set, Map, Errors ].each { addConverters(it) } 
     def xmlErrorMarshaller = new ValidationErrorsMarshaller() 
     XML.registerObjectMarshaller(xmlErrorMarshaller) 
     def jsonErrorMarshaller = new ValidationErrorsMarshaller() 
     JSON.registerObjectMarshaller(jsonErrorMarshaller) 

     ApplicationHolder.application.addArtefact("Domain", Foo) 
     mockDomain(Foo, [new Foo(foo: "foo")]) 
    } 

    @Test 
    void testJSON() { 
     def inst = Foo.list()[0] 
     controller.params.id = inst.id 
     def model = controller.find() 
     assert controller.response.json.foo == "foo" 
    } 

    @Override 
    protected def bindMockWebRequest(GrailsMockHttpServletRequest mockRequest, GrailsMockHttpServletResponse mockResponse) { 
     MockApplicationContext ctx = new MockApplicationContext() 
     application = new DefaultGrailsApplication([testClass] as Class[], getClass().classLoader) 
     application.initialise() 
     ctx.registerMockBean("grailsApplication", application) 
     ctx.registerMockBean(testClass.name, testClass.newInstance()) 
     def lookup = new TagLibraryLookup(applicationContext: ctx, grailsApplication: application) 
     lookup.afterPropertiesSet() 
     ctx.registerMockBean("gspTagLibraryLookup", lookup) 
     ctx.registerMockBean(GroovyPagesUriService.BEAN_ID, new DefaultGroovyPagesUriService()) 
     mockRequest.servletContext.setAttribute(ApplicationAttributes.APPLICATION_CONTEXT, ctx) 
     mockRequest.servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, ctx) 

     webRequest = new GrailsWebRequest(mockRequest, mockResponse, mockRequest.servletContext) 

     mockRequest.setAttribute(GrailsApplicationAttributes.WEB_REQUEST, webRequest) 
     RequestContextHolder.setRequestAttributes(webRequest) 
    } 
} 

희망!

관련 문제