如何使用RSpec/RoR测试AJAX请求?

use*_*826 54 testing ajax rspec ruby-on-rails mocha.js

我对RoR很新,最近开始学习BDD/Rspec来测试我的应用程序.我一直在寻找一种规范AJAX请求的方法,但到目前为止我还没有找到很多文档.

有人知道怎么做吗?我正在使用rails 2.3.8,rspec 1.3.0和mocha 0.9.8作为我的存根(我也正在学习......)

Rob*_*her 108

如果你正在谈论在你通常打电话的控制器规格内测试它

get :index
Run Code Online (Sandbox Code Playgroud)

要对索引操作发出HTTP请求,您可以调用

xhr :get, :index
Run Code Online (Sandbox Code Playgroud)

使用GET对索引操作发出XmlHttpRequest(AJAX)请求.

  • 真棒!这对我有用.`xhr:put,:update,:format =>"js"` (6认同)
  • 我认为你甚至不需要`:format` :) (6认同)

odl*_*dlp 28

Rails 5

从Rails 5.0(使用RSpec 3.X)开始,尝试这样设置xhr: true:

get :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)


use*_*228 5

Rails 5和rspec> 3.1的语法有所变化(我相信)

对于POST请求:

post :create, xhr: true, params: { polls: { question: 'some' } }
Run Code Online (Sandbox Code Playgroud)

您现在需要显式设置 params

for GET requests:

get :action, xhr: true, params: { id: 10 }
Run Code Online (Sandbox Code Playgroud)

for rails 4 and rspec <= 3.1

xhr post :create, { polls: { question: 'some' } }
Run Code Online (Sandbox Code Playgroud)

GET requests:

xhr get :show, id: 10
Run Code Online (Sandbox Code Playgroud)