web-dev-qa-db-ja.com

RSpecでパーシャルのレンダリングをテストする方法

いくつかの条件に従って特定のパーシャルのレンダリングをテストしたいです。

たとえば、モデルのショーアクションビュー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">でレンダリングします

私が間違っているのは何ですか?

46
Pavel

これも試してみてください

 response.should render_template(:partial => 'partial_name')
67
Rishav Rastogi

最新のrspecバージョンでは、expectではなくshould構文を使用することをお勧めします。

expect(response).to render_template(partial: 'partial_name')
28
swilgosz

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ステートメントが同じものをレンダリングしているため、注意が必要です。

5
Diego D

Rails 5.1、 この種のテストはお勧めできません。コントローラーとビュー全体をテストする必要があります

どのパーシャルがコントロールによってレンダリングされるかをチェックすることは、テストすべきではない実装の詳細の一部です。

したがって、リクエストテストを作成し、パーシャルの関連テキストが応答本文に存在することを確認することをお勧めします。

get root_path
expect(CGI.unescape_html(response.body)).to include('Hello World')
0
coorasse

Rspecコントローラーで使用する場合

expect(response).to render_template(partial: 'home/_sector_performance')
0
user2238766

コントローラーが必要なアクションを推測したかどうかをテストすることもできます。

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

ドキュメントは こちら です

0
Dende