いくつかの条件に従って特定のパーシャルのレンダリングをテストしたいです。
たとえば、モデルのショーアクションビューshow.html.erb
私が持っています:
<% if condition1 %>
<%= render :partial => "partial1" %>
<% else %>
<%= render :partial => "partial1" %>
<% end %>
私は試した:
response.should render_template("partial_name")
しかし、それは「show」テンプレートをレンダリングしたことを伝えます
<"partial1">が必要ですが、<"model/show、layouts/application">でレンダリングします
私が間違っているのは何ですか?
これも試してみてください
response.should render_template(:partial => 'partial_name')
最新のrspecバージョンでは、expect
ではなくshould
構文を使用することをお勧めします。
expect(response).to render_template(partial: 'partial_name')
controller内でこれをテストする場合は、次のようなことをする必要があります。
RSpec.describe Users::RegistrationsController, type: :controller do
describe "GET #new" do
render_views
it "render customer partial" do
get :new
expect(response).to render_template :new
expect(response).to render_template(partial: '_new_customer')
end
end
end
documentation に報告されるように、render_viewsが必要であることに注意してください。
そして、これは「_new_customer」パーシャルがレンダリングされるかどうかをテストする行です:
expect(response).to render_template(partial: '_new_customer')
パーシャルの名前に最初の下線を付ける必要があります。
また、コードではIFステートメントとELSEステートメントが同じものをレンダリングしているため、注意が必要です。
Rails 5.1、 この種のテストはお勧めできません。コントローラーとビュー全体をテストする必要があります 。
どのパーシャルがコントロールによってレンダリングされるかをチェックすることは、テストすべきではない実装の詳細の一部です。
したがって、リクエストテストを作成し、パーシャルの関連テキストが応答本文に存在することを確認することをお勧めします。
get root_path
expect(CGI.unescape_html(response.body)).to include('Hello World')
Rspecコントローラーで使用する場合
expect(response).to render_template(partial: 'home/_sector_performance')
コントローラーが必要なアクションを推測したかどうかをテストすることもできます。
require "spec_helper"
describe "model_name/new.html.erb" do
it "infers the controller path" do
expect(controller.request.path_parameters["action"]).to eq("new")
end
end
ドキュメントは こちら です