我有一个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请求进行了非常类似的单元测试,它的工作正常。
答案 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插件,你的例子应该可以工作。