2009-12-08 42 views
0

我有一個放置請求,我正嘗試爲創建用戶對象進行單元測試。使用XML的Grails PUT請求

單元測試:

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映射爲null。我有一個非常類似的POST請求單元測試,它工作得很好。

回答

0

Grails本地支持REST,所以Grails爲PUT和POST強制執行HTTP規範。 PUT的規則之一是它需要一個完整的URL,包括正在執行的對象的ID。在這種情況下,創建新用戶時,直到請求後才能識別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插件,你的例子應該可以工作。