コントローラのアクションが次のようになっている場合:
respond_to do |format|
format.html { raise 'Unsupported' }
format.js # index.js.erb
end
機能テストは次のようになります。
test "javascript response..." do
get :index
end
response_toブロックのHTMLブランチを実行します。
これを試してみると:
test "javascript response..." do
get 'index.js'
end
コントローラアクションを実行せずにビュー(index.js.erb)を実行します!
通常のパラメータで:format
を渡して、その形式で応答をトリガーします。
get :index, :format => 'js'
リクエストヘッダーをいじる必要はありません。
rspecで:
it "should render js" do
xhr :get, 'index'
response.content_type.should == Mime::JS
end
そしてあなたのコントローラーアクションで:
respond_to do |format|
format.js
end
受け入れられるコンテンツタイプを必要なタイプに設定します。
@request.accept = "text/javascript"
これをget :index
テストと組み合わせると、コントローラーに適切な呼び出しが行われます。
リクエストの前にこれを使用してください:
@request.env['HTTP_ACCEPT'] = 'text/javascript'
RSpec3.7およびRails 5.xソリューション:
私の場合、これらの回答のいくつかは少し時代遅れだったので、Rails 5およびRSpec3.7を実行している人に回答を提供することにしました。
it "should render js" do
get :index, xhr: true
expect(response.content_type).to eq('text/javascript')
end
スティーブの answer と非常に似ていますが、いくつかの調整が加えられています。最初のxhr
は、ブールキー/ペアとして渡されます。 2つ目は、expect
を使用すると非推奨の警告が表示されるため、should
を使用するようになりました。応答のcontent_type
をtext/javascript
と等しくなるように比較することは私にとってはうまくいきました。
これらの3つは同等のようです。
get :index, :format => 'js'
@request.env['HTTP_ACCEPT'] = 'text/javascript'
@request.accept = "text/javascript"
これにより、コントローラーはjsテンプレート(例:index.js.erb)を使用します。
XHRリクエストのシミュレーション(HTMLスニペットの取得など)では、次のように使用できます:@request.env['HTTP_X_REQUESTED_WITH'] = "XMLHttpRequest"
これはrequest.xhrを意味しますか? trueを返します。
XHRをシミュレートするときに、予期される形式を指定する必要があったか、エラーが発生したことに注意してください。
get :index, format: "html"
Rails 3.0.3でテスト済み。
後者はRailsソース、ここ: https://github.com/Rails/rails/blob/6c8982fa137421eebdc55560d5ebd52703b65c65/actionpack/lib/action_dispatch/http/requestから入手しました。 rb#L16
上記の回答の多くは時代遅れです。
RSpec3 +でそれを行う正しい方法はpost some_path, xhr: true
です。
xhr :post, "some_path"
を使おうとすると、RSpec自体から直接非推奨の警告が表示されます。
DEPRECATION WARNING: `xhr` and `xml_http_request` are deprecated and will be removed in Rails 5.1.
Switch to e.g. `post comments_path, params: { comment: { body: 'Honey bunny' } }, xhr: true`.
また、xhr :post, "some_path"
は、post some_path, xhr: true
では発生しないファンキーなエラーを引き起こします。
パラメータやユーザーIDなどにこのようなコードを使用します。フォーマットオプションは、idやnested_attributesなどの他のパラメータと同じハッシュにあることに注意してください。
put :update, {id: record.id, nested_attributes: {id: 1, name: "John"}, format: :js}, user.id
私は同様の問題を抱えていました:
# controller
def create
respond_to do |format|
format.js
end
end
# test
test "call format js" do
record = promos(:one)
post some_url(record)
assert true
end
結果はこれでした:
> Rails test
Error:
ActionController::UnknownFormat: ActionController::UnknownFormat
私はこれをテストに合わせて調整して修正しました(ヘッダーを追加します):
test "call format js" do
record = promos(:one)
headers = { "accept" => "text/javascript" }
post some_url(record), headers: headers
assert true
end
Rails(6.0.0.beta3)