Как проверить рендеринг частичного с RSpec - PullRequest
46 голосов
/ 30 марта 2012

Я хочу проверить рендеринг конкретного фрагмента в соответствии с некоторыми условиями.

Например, в представлении модели show action show.html.erb У меня есть:

<% if condition1 %>
 <%=  render :partial => "partial1" %>
<% else %>
 <%=  render :partial => "partial1" %>
<% end %>

Я пробовал:

response.should render_template("partial_name")

но это говорит о том, что он отобразил шаблон "show"

, ожидая <"part1">, но рендеринг с <"model / show, layout / application">

Что я делаю не так?

Ответы [ 6 ]

67 голосов
/ 30 марта 2012

Также попробуйте это

response.should render_template(:partial => 'partial_name')
28 голосов
/ 09 июля 2014

Последняя версия rspec предлагает использовать expect синтаксис вместо should:

expect(response).to render_template(partial: 'partial_name')
5 голосов
/ 03 марта 2017

Если вы тестируете это внутри контроллера , вы должны сделать что-то вроде этого:

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 отображают одно и то же.

0 голосов
/ 21 февраля 2018

Начиная с Rails 5.1, этот вид тестирования не рекомендуется, и вам следует протестировать контроллер и представление в целом .

Проверка того, какая часть отображается контролируемым, является частью деталей реализации, которые вы не должны проверять.

Поэтому я предлагаю вам написать тест запроса и проверить, что какой-то соответствующий текст вашей частиприсутствует в теле ответа.

get root_path
expect(CGI.unescape_html(response.body)).to include('Hello World')
0 голосов
/ 08 февраля 2018

При использовании в контроллерах rspec

expect(response).to render_template(partial: 'home/_sector_performance')
0 голосов
/ 26 сентября 2013

Вместо вышеупомянутого решения вы могли бы альтернативно проверить, присутствует ли HTML, который частично отображает.Например,

response.body.should have_tag("div#foo")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...