Ответ 1
Также попробуйте
response.should render_template(:partial => 'partial_name')
Я хочу проверить рендеринг определенного частица в соответствии с некоторыми условиями.
Например, в представлении вида представления модели show.html.erb
у меня есть:
<% if condition1 %>
<%= render :partial => "partial1" %>
<% else %>
<%= render :partial => "partial1" %>
<% end %>
Я пробовал:
response.should render_template("partial_name")
но он сообщает, что он отобразил шаблон "показать"
ожидающий < "partial1" > но рендеринг с < "model/show, макеты/приложения" >
Что я делаю неправильно?
Также попробуйте
response.should render_template(:partial => 'partial_name')
В последней версии rspec предлагается использовать синтаксис expect
, а не should
:
expect(response).to render_template(partial: 'partial_name')
Если вы тестируете это внутри контроллера, вы должны сделать что-то вроде этого:
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
Обратите внимание, что нам нужны render_views, как указано в документации.
И это строка, которая будет проверять, отображается ли частичная часть _new_customer:
expect(response).to render_template(partial: '_new_customer')
Вам необходимо указать имя части с начальным подчеркиванием.
Также будьте осторожны, потому что в вашем коде операторы IF и ELSE отображают одно и то же.
При использовании в контроллерах rspec
expect(response).to render_template(partial: 'home/_sector_performance')
Начиная с Rails 5.1, этот вид тестирования не рекомендуется, и вам следует протестировать контроллер и представление в целом.
Проверка того, какая часть визуализируется контролируемым, является частью деталей реализации, которые вы не должны тестировать.
Поэтому я предлагаю вам написать тест запроса и убедиться, что в теле ответа присутствует соответствующий текст вашей части.
get root_path
expect(CGI.unescape_html(response.body)).to include('Hello World')
Вы также можете проверить, выдвинул ли ваш контроллер необходимые действия.
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
Документы здесь here
Вместо вышеупомянутого решения вы можете проверить альтернативно, если html, который присутствует в частичном рендере. Например.
response.body.should have_tag("div#foo")