ruby on rails-如何使用RSp测试渲染局部

我想根据某些条件测试渲染特定的局部。

例如,在模型展示动作视图show.html.erb中,我具有:

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

我试过了:

response.should render_template("partial_name")

但它告诉它呈现了“显示”模板

期望<“ partial1”>,但使用<“ model / show呈现,   布局/应用程序“>

我做错了什么?

Pavel asked 2020-02-21T22:30:53Z
7个解决方案
67 votes

也试试这个

response.should render_template(:partial => 'partial_name')
Rishav Rastogi answered 2020-02-21T22:31:06Z
28 votes

最新的rspec版本建议使用expect语法,而不是should

expect(response).to render_template(partial: 'partial_name')
swilgosz answered 2020-02-21T22:31:26Z
5 votes

如果要在控制器中进行测试,则应执行以下操作:

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语句正在渲染同一件事。

Diego D answered 2020-02-21T22:32:03Z
0 votes

如果在rspec控制器中使用

expect(response).to render_template(partial: 'home/_sector_performance')
user2238766 answered 2020-02-21T22:32:23Z
0 votes

从Rails 5.1开始,不建议进行这种测试,您应该对控制器和视图进行整体测试。

检查哪个部分由控件呈现是您不应测试的实现详细信息的一部分。

因此,我建议您编写一个请求测试,并检查响应正文中是否存在部分相关的文本。

get root_path
expect(CGI.unescape_html(response.body)).to include('Hello World')
coorasse answered 2020-02-21T22:32:53Z
0 votes

您还可以测试控制器是否推断出需要采取的措施。

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

文档在这里

Dende answered 2020-02-21T22:33:17Z
-3 votes

除了上述解决方案外,您还可以检查是否存在部分渲染的html。 例如。

response.body.should have_tag("div#foo")
auralbee answered 2020-02-21T22:33:37Z
translate from https://stackoverflow.com:/questions/9946502/how-to-test-rendering-a-partial-with-rspec