使用 stub_template

为了将视图规范与主视图渲染的片段隔离开来,rspec-rails(从 2.2 版开始)提供了 stub_template 方法。

存根不存在的模板

给定 一个名为“spec/views/gadgets/list.html.erb_spec.rb”的文件,内容为

require "rails_helper"

RSpec.describe "gadgets/list" do
  it "renders the gadget partial for each gadget" do
    assign(:gadgets, [
      double(:name => "First"),
      double(:name => "Second")
    ])
    stub_template "gadgets/_gadget.html.erb" => "<%= gadget.name %><br/>"
    render
    expect(rendered).to match /First/
    expect(rendered).to match /Second/
  end
end

以及 一个名为“app/views/gadgets/list.html.erb”的文件,内容为

<%= render :partial => "gadget", :collection => @gadgets %>

我运行 rspec spec/views/gadgets/list.html.erb_spec.rb

示例应该全部通过。

存根存在的模板

给定 一个名为“spec/views/gadgets/edit.html.erb_spec.rb”的文件,内容为

require "rails_helper"

RSpec.describe "gadgets/edit" do
  before(:each) do
    @gadget = assign(:gadget, Gadget.create!)
  end

  it "renders the form partial" do
    stub_template "gadgets/_form.html.erb" => "This content"
    render
    expect(rendered).to match /This content/
  end
end

我运行 rspec spec/views/gadgets/edit.html.erb_spec.rb

示例应该全部通过。