Подтвердить что ты не робот

Как проверить рендеринг части с RSpec

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

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

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

Я пробовал:

response.should render_template("partial_name")

но он сообщает, что он отобразил шаблон "показать"

ожидающий < "partial1" > но рендеринг с < "model/show, макеты/приложения" >

Что я делаю неправильно?

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

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

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

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

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

Ответ 6

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

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

Ответ 7

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

response.body.should have_tag("div#foo")