使用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 ValidationjQuery 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方式。 我希望这可以帮助别人。

链接地址: http://www.djcxy.com/p/7963.html

上一篇: Testing an AJAX POST using Rack::Test

下一篇: RS response with HTTP status 500 instead of HTTP status 400