Rails使用Post数据测试XHR

Dan*_*ana 12 ruby-on-rails

我只是把我的脚趾浸入Ruby和Rails中,并试图让我的头脑完成整个BDD的事情.我有一个页面,它将一个AJAX POST回到一个控制器,该控制器有一个名为"sort"的方法,并传递一个像这样的id数组

["song-section-5", "song-section-4", "song-section-6"]
Run Code Online (Sandbox Code Playgroud)

我想为此写一个测试,所以我提出了这样的事情:

test "should sort items" do
  xhr :post, :sort
end
Run Code Online (Sandbox Code Playgroud)

但无法弄清楚如何传递数组.有帮助吗?

mon*_*cle 17

来自Rails的源代码

def xml_http_request(request_method, action, parameters = nil, session = nil, flash = nil)
Run Code Online (Sandbox Code Playgroud)

该方法的第三个输入是"参数".这些是发送给您的控制器的参数.

xhr :post, :sort, { :ids => ["song-section-5", "song-section-4", "song-section-6"] }
Run Code Online (Sandbox Code Playgroud)

  • 注意.`xhr`在rails 5中已弃用.请改用"xhr:true"选项. (8认同)
  • You️⬆️⬆️你,真正的MVP (2认同)

odl*_*dlp 13

对我来说,使用RSpec 3.6和Rails 5.1,之前的答案失败了:

xhr :post, :index

# => NoMethodError: undefined method `xhr' for #<RSpec::ExampleGroups::XController::Index::AJAXRequest:0x007fd9eaa73778>
Run Code Online (Sandbox Code Playgroud)

Rails 5.0+

而是尝试这样设置xhr: true:

post :index, xhr: true
Run Code Online (Sandbox Code Playgroud)

背景

这是ActionController :: TestCase中的相关代码.设置xhr标志最终添加以下标头:

if xhr
  @request.set_header "HTTP_X_REQUESTED_WITH", "XMLHttpRequest"
  @request.fetch_header("HTTP_ACCEPT") do |k|
    @request.set_header k, [Mime[:js], Mime[:html], Mime[:xml], "text/xml", "*/*"].join(", ")
  end
end
Run Code Online (Sandbox Code Playgroud)