3

我正在使用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

但是在服务器端它没有接收到发布的数据。

我也尝试只传入 params 哈希,to_json但没有任何区别。

知道怎么做吗?

4

2 回答 2

4

您的 post 端点必须解析发布的 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
于 2013-09-17T10:52:16.813 回答
2

好的,所以我的解决方案有点奇怪,并且首先针对我触发 JSON 请求的方式,即在客户端 使用jQuery Validation和插件。没有像我预期的那样将表单字段捆绑到字符串化的哈希中,而是通过 AJAX 发送表单字段,但作为经典的 URI 编码参数字符串。因此,通过将我的测试更改为以下内容,它现在可以正常工作了。jQuery FormsjQuery Forms

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。我希望这对其他人有帮助。

于 2013-09-18T01:45:40.780 回答