【问题标题】:Testing an AJAX POST using Rack::Test - how to pass in data?使用 Rack::Test 测试 AJAX POST - 如何传入数据?
【发布时间】:2013-09-10 08:11:20
【问题描述】:

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

知道怎么做吗?

【问题讨论】:

    标签: ajax rest sinatra rack-test


    【解决方案1】:

    您的 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
    

    【讨论】:

    • 有趣。在我的实际应用程序代码中,Sinatra 的 params 变量会自动填充来自 AJAX 请求的数据,但是当从测试发送数据时,我可以按照您的建议提取它,但不会填充 params。事实上,当我将JSON.parse 行添加到我的代码中时,我得到了JSON::ParserError。这让我怀疑问题出在jQuery forms 插件的ajaxSubmit 方法发送数据的方式上。看来我的错误毕竟不在测试中。谢谢你给了我一个进一步探索的询问线。
    【解决方案2】:

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

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

    【讨论】:

    • 有必要吗?我的印象是,如果您删除 Content-Type 和 URI.encode_www_form,它会自动将表单处理为 JSON 或 Form-URL-Encoded。 (您没有在此处或问题中提到是否尝试不使用 post() 的第三个(即哈希)参数。)
    • 谢谢@RobHoward,我改变了我的测试,你是对的。我已经相应地更新了我的答案。我仍然需要HTTP_X_REQUESTED_WITH 参数,所以服务器知道这是一个 AJAX 的东西。干杯D
    • 谢谢。我试图让一个测试用例工作但它失败了,因为我不知道如何让它发送一个 xhr 请求(如果有帮助的话,在使用 Minitest 的 Padrino 中)。添加 HTTP_X_REQUESTED_WITH 标头解决了这个问题!
    猜你喜欢
    • 2013-09-01
    • 2012-02-19
    • 2015-03-25
    • 2011-11-09
    • 1970-01-01
    • 1970-01-01
    • 2015-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多