使用Rack :: Test测试AJAX POST
我正在使用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
但在服务器端没有收到POST数据。
我也试过只传入没有to_json
的params散列,但这没有什么区别。
任何想法如何做到这一点?
您的发布端点必须解析发布的JSON主体本身,我假定您已经这样做了。 你可以发布你的终点如何工作,还有机架测试,机架,ruby和sinatra版本号吗? 请再提一下你如何测试服务器是否接收任何东西 - 即测试模型可能会混淆你的检测。
post '/user' do
json_data = JSON.parse(request.body.read.to_s)
# or # json_data = JSON.parse(request.env["rack.input"].read)
...
end
好吧,所以我的解决方案有点奇怪,特别是我触发我的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方式。 我希望这可以帮助别人。
上一篇: Testing an AJAX POST using Rack::Test
下一篇: RS response with HTTP status 500 instead of HTTP status 400