web-dev-qa-db-ja.com

Railsでは、Javascript応答形式をどのように機能テストしますか?

コントローラのアクションが次のようになっている場合:

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)を実行します!

35
Teflon Ted

通常のパラメータで:formatを渡して、その形式で応答をトリガーします。

get :index, :format => 'js'

リクエストヘッダーをいじる必要はありません。

60
Alex Wayne

rspecで:

it "should render js" do
  xhr :get, 'index'
  response.content_type.should == Mime::JS
end

そしてあなたのコントローラーアクションで:

respond_to do |format|
  format.js
end
25
Steven Soroka

受け入れられるコンテンツタイプを必要なタイプに設定します。

@request.accept = "text/javascript"

これをget :indexテストと組み合わせると、コントローラーに適切な呼び出しが行われます。

5
Craig Walker

リクエストの前にこれを使用してください:

@request.env['HTTP_ACCEPT'] = 'text/javascript'
3
Edgard Arakaki

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_typetext/javascriptと等しくなるように比較することは私にとってはうまくいきました。

2
Carl Edwards

これらの3つは同等のようです。

  1. get :index, :format => 'js'
  2. @request.env['HTTP_ACCEPT'] = 'text/javascript'
  3. @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

1
Jamie Cobbett

上記の回答の多くは時代遅れです。

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では発生しないファンキーなエラーを引き起こします。

0
the12

パラメータやユーザーIDなどにこのようなコードを使用します。フォーマットオプションは、idやnested_attributesなどの他のパラメータと同じハッシュにあることに注意してください。

put :update, {id: record.id, nested_attributes: {id: 1, name: "John"}, format: :js}, user.id
0
Gongqin Shen

私は同様の問題を抱えていました:

# 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)

0
mario199