2009-12-08 3 views
0

사용자 개체 생성을위한 단위 테스트를 요청하는 요청이 있습니다.Grails PUT 요청 (XML 포함)

단위 테스트 :

void testPUTXMLResponse() { 
    def mockUser = new User(username:"fred", password:User.encrypt("letmein"), firstName:"Fred", lastName:"Flintstone", middleName:"T", phone:"555-555-5555", email:'[email protected]', activationDate:new Date(), logonFailureCount:0) 
    mockDomain(User, [mockUser]) 

    def mockUserXML = mockUser as XML 
    mockRequest.method = 'PUT' 
    mockRequest.contentType = 'text/xml' 
    mockRequest.format = 'xml' 
    mockRequest.content = mockUserXML.toString().getBytes() 

    controller.create() 

    def updatedUser = XML.parse(mockResponse.contentAsString) 
    assert updatedUser.id == 1 
} 

컨트롤러 액션 : 컨트롤러의 동작이 실행될 때 어떤 이유

def create = { 
    println request.xml 
    def user = new User(params.user) 
    if(!user.hasErrors() && user.save()) { 
     println user.id 
     withFormat { 
      html { /*render(view:"show", [user:user])*/ } 
      xml { render user as XML } 
      json { render user as JSON } 
     } 
    } else { 
     println user.errors 
     withFormat { 
      html { /*render(view:"create", [user:user])*/ } 
      xml { render user.errors as XML } 
      json { render user.errors as JSON } 
     } 
    } 
} 

는 PARAMS 맵은 널이다. POST 요청에 대해 매우 유사한 단위 테스트가 있는데 정상적으로 작동합니다.

답변

0

Grails는 기본적으로 REST를 지원하므로 Grails는 PUT 및 POST에 대한 HTTP 사양을 적용합니다. PUT에 대한 규칙 중 하나는 작업 대상의 ID를 포함하여 전체 URL이 필요하다는 것입니다. 이 경우 새 사용자를 만들 때 ID는 요청 후에 만 ​​알 수 있습니다. 따라서 전체 URL을 알 수 없으므로 PUT 요청이 실패합니다. POST에는이 제한이 없습니다. PUT 및 POST에 대한 자세한 내용은 http://jcalcote.wordpress.com/2008/10/16/put-or-post-the-rest-of-the-story/

0

을 참조하십시오. 설명 된 문제는 Tomcat에서 PUT 대 POST 요청 (see here)을 처리하는 차이가 원인 인 것으로 보입니다. 부두로 Tomcat 플러그인을 전환하면 예제가 효과적입니다.