Rspec部分问题

Rspec部分问题,rspec,partials,Rspec,Partials,我正在为视图编写规范,它在布局中呈现了一个菜单(部分菜单)。我想为所选菜单编写规格。这是密码 it "should have User Administration link" do template.stub!(:render).and_return(:partial => "layouts/admin/menu") do_render #render :partial => "layouts/admin/menu" #do response.sho

我正在为视图编写规范,它在布局中呈现了一个菜单(部分菜单)。我想为所选菜单编写规格。这是密码

it "should have User Administration link" do
    template.stub!(:render).and_return(:partial => "layouts/admin/menu")
    do_render
    #render :partial => "layouts/admin/menu" #do
    response.should have_tag('div.menu1')
    response.should have_tag('ul') do
      response.should have_tag('li')do
        with_tag("a[href=?]", admin_users_path)
      end
    end
  end
这个规格不合格。我没有找到正确的方法来编写分区规范,我尝试了:
模板。应该接收(:render)。同时(:partial=>“/layout/admin/menu”)

感谢和问候,
普拉文。

我不认为这句话:

template.stub!(:render).and_return(:partial => "layouts/admin/menu")
做你认为它在做的事。RSpec不会调用template.render:partial=>“layouts/admin/menu”。当调用render时,它只会删除render并返回{:partial=>“layouts/admin/menu”}


为什么呢?您希望视图实际呈现,以便响应主体具有您想要测试的数据,除非我遗漏了某些内容,我可能是:)

我意识到这是一个古老的讨论,但我遇到了类似的问题,所以我的解决方案可能会帮助其他人

我的问题是我的模拟方法没有被调用,因为我没有得到正确的“with”。这是我所拥有的,但不起作用:

# widgets/new.html.erb
<% form_for(@widgets) do |f| %>
  <%= render :partial => "form", :locals => {:f => f} %>
  <%= f.submit "Create" %>
<% end %>

# widgets/new.html.erb_spec.rb
describe "widgets/new.html.erb" do
  let(:widget) { @widget ||= Widget.new }
  it "displays a form" do
    template.should_receive(:render).
      with(:partial => "form").
        and_return("<span id=\"rendered-form\"/>")
    render
    response.should have_tag("form[method=?][action=?]", "put", widget_path(widget)) do |form|
      form.should have_tag("span[id=?]", "rendered-form")
      form.should have_tag("input[type=?][value=?]", "submit", "Create")
    end
  end
end
但我的规范是在嘲笑:

render :partial => "form"
所以很自然,我的模拟方法不会被调用。一旦我意识到这一点,我就开始尝试模仿form_和其他各种东西,但解决方法要简单得多:

template.should_receive(:render).
  with(hash_including(:partial => "form")).
    and_return("<span id=\"rendered-form\"/>")
模板。应接收(:render)。
使用(hash_包括(:partial=>“form”))。
和_返回(“”)
缺少的是hash_include()


所以,也许你的问题是类似的:你没有真正嘲笑你认为你在嘲笑的东西。

什么是“do_render”?至于为什么要使用存根渲染,你不应该这样做,因为这很危险。你的模板可能会开始调用render(),而你的规范将无法捕获它们。忽略我上面的评论,这是它应该说的:至于为什么要使用存根渲染,这是规范和测试之间的细微差别。模板应该有一个精确定义其功能的规范,而零件应该有自己的规范,精确定义其功能。
template.should_receive(:render).
  with(hash_including(:partial => "form")).
    and_return("<span id=\"rendered-form\"/>")