使用Rack :: Test测试AJAX POST - 如何传入数据?

时间:2013-09-10 08:11:20

标签: ajax rest sinatra rack-test

我正在使用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哈希,但没有区别。

知道怎么做吗?

2 个答案:

答案 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 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。我希望这有助于其他人。