使用XML的Grails PUT请求

时间:2009-12-08 15:55:10

标签: unit-testing rest 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:'fred@fred.com', 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 map为null。我对POST请求进行了非常类似的单元测试,它的工作正常。

2 个答案:

答案 0 :(得分: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/

答案 1 :(得分:0)

您所描述的问题似乎是由Tomcat处理PUT与POST请求(see here)之间的差异引起的。切换为jetty的tomcat插件,你的例子应该可以工作。