RSpec中的测试视图产量

时间:2017-09-19 01:25:55

标签: ruby-on-rails ruby rspec

我有一个目前产生的视图布局文件:

Layout.html.slim:

html
  header
    [content]
  = yield :page_content
  footer
    [content]

然后是一个格式相同的模板文件。

template.html.slim:

- content_for :page_content
  #hello

我希望能够在不测试布局上的任何内容的情况下测试模板的内容。我发现如果我创建一个rake布局文件,我可以在rspec中执行以下操作:

describe "template.html.slim", type: :view do
  it "should render a div" do
    render template: 'template', layout: 'test_yielder'
    expect(rendered).to have_tag("#hello")
  end
end

其中test_yielder是一行文件:

= yield :page_content

虽然这可以完成工作,但我想知道是否有更简洁的方法来测试template的内容,而无需创建额外的test_yielder文件,只更改我调用{{{ 1}}功能?

是否存在更清洁的方式?

1 个答案:

答案 0 :(得分:1)

我通常在控制器渲染时测试模板的输出。

按照您的方法,您可以参考view_spec

  

在规范/视图中查看规范,并单独呈现视图模板。

# app/views/widgets/widget.html.erb
<h2><%= @widget.name %></h2>


# spec/views/widgets/widget.html.erb_spec.rb
require "spec_helper"

describe "rendering the widget template" do
  it "displays the widget" do
    assign(:widget, stub_model(Widget, name: "slicer"))

    render template: "widgets/widget.html.erb"
    rendered.should contain("slicer")
  end
end

这可以在不考虑任何布局的情况下工作。最后,您可以指定render template: 'something', layout: false但不是真的需要。

我想说这已经是一个干净的解决方案了。

如果您多次重复此操作,最终可以在测试套件中添加辅助模块(请参阅this answer

如果您的template.html.slim是正确的,那么您的测试应该按预期工作。 (我在slim repo上发现这个非常古老的问题以供参考)