我正在使用Rack::Test测试我的应用,需要通过AJAX测试数据发布。
我的测试看起来像:
describe 'POST /user/' do
include Rack::Test::Methods
it 'must allow user registration with valid information' do
post '/user', {
username: 'test_reg',
password: 'test_pass',
email: 'test@testreg.co'
}.to_json, {"CONTENT_TYPE" => 'application/json', "HTTP_X_REQUESTED_WITH" => "XMLHttpRequest"}
last_response.must_be :ok?
last_response.body.must_match 'test_reg has been saved'
end
end
但是在服务器端,它没有收到POSTed数据。
我也试过在没有to_json
的情况下传递params哈希,但没有区别。
知道怎么做吗?
答案 0 :(得分:4)
您的帖子端点必须解析已发布的JSON正文,我假设您已经这样做了。你能发布你的终点如何工作,还有机架测试,机架,红宝石和sinatra版本号?另请注意您如何测试服务器是否接收任何内容 - 即测试模型可能会混淆您的检测。
post '/user' do
json_data = JSON.parse(request.body.read.to_s)
# or # json_data = JSON.parse(request.env["rack.input"].read)
...
end
答案 1 :(得分:2)
好的,所以我的解决方案有点奇怪,特别是我首先触发我的JSON请求的方式,即在客户端使用jQuery Validation
和jQuery Forms
插件。 jQuery Forms
没有像我期望的那样将表单字段捆绑到字符串化的哈希中,而是通过AJAX发送表单字段,但是作为经典URI编码的params字符串。因此,通过将我的测试更改为以下内容,它现在可以正常工作。
describe 'POST /user/' do
include Rack::Test::Methods
it 'must allow user registration with valid information' do
fields = {
username: 'test_reg',
password: 'test_pass',
email: 'test@testreg.co'
}
post '/user', fields, {"HTTP_X_REQUESTED_WITH" => "XMLHttpRequest"}
last_response.must_be :ok?
last_response.body.must_match 'test_reg has been saved'
end
end
当然这是jQuery Forms
插件的工作方式,而不是通常如何通过AJAX测试JSON数据的POST。我希望这有助于其他人。