web-dev-qa-db-ja.com

RSpec / RoRでAJAXリクエストをどのようにテストしますか?

私はRoRにかなり慣れていませんが、最近、アプリケーションのテスト用にBDD/Rspecを学び始めました。 AJAX=リクエストを指定する方法を探していましたが、これまでのところ、これに関するドキュメントはほとんど見つかりません。

誰でもこれを行う方法を知っていますか?私はRails 2.3.8、rspec 1.3.0、およびモカ0.9.8を私のスタブに使用しています(これも学習中です...)

54
user480826

コントローラの仕様の中でテストすることについて話している場合、通常は

get :index

インデックスアクションへのHTTPリクエストを行うには、代わりに

xhr :get, :index

gETを使用して、インデックスアクションにXmlHttpRequest(AJAX)リクエストを送信します。

107
Robert Speicher

Rails 5/6

Rails 5.0(RSpec 3.X))なので、xhr: trueを次のように設定してみてください:

get :index, xhr: true

バックグラウンド

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
27
odlp

構文がRails 5およびrspec> 3.1の場合に少し変更されました(信じます)

POSTリクエストの場合:

post :create, xhr: true, params: { polls: { question: 'some' } }

明示的にparamsを設定する必要があります

gETリクエストの場合:

get :action, xhr: true, params: { id: 10 }

Rails 4およびrspec <= 3.1

xhr post :create, { polls: { question: 'some' } }

GETリクエスト:

xhr get :show, id: 10
4
user1136228