【问题标题】:Rspec partials problemRspec 部分问题
【发布时间】:2011-01-05 20:45:47
【问题描述】:

我正在为 View 编写规范,它有一个在布局中呈现的菜单(部分显示)。我想为选定的菜单编写规格。这是代码

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

此规范失败。我没有找到正确的方法来编写部分规范,我尝试过: template.should_receive(:render).with(:partial => "/layout/admin/menu")也是。

感谢和问候, 普拉文。

【问题讨论】:

  • “do_render”的定义是什么?

标签: rspec partials


【解决方案1】:

我不认为这条线:

template.stub!(:render).and_return(:partial => "layouts/admin/menu")

正在做你认为它正在做的事情。 RSpec 不会调用 template.render :partial => "layouts/admin/menu"。它只是在调用渲染时将渲染存根并返回 {:partial => "layouts/admin/menu"} 。

为什么要存根渲染?您希望视图实际呈现,以便响应正文具有您想要测试的数据,除非我遗漏了某些东西,我可能是。 :)

【讨论】:

  • 至于为什么要渲染存根,你不应该因为它很危险。您的模板可能会开始调用 render() 并且您的规范不会捕获它们。
  • 忽略我上面的评论,这就是它应该说的:至于为什么要渲染存根,这是规范和测试之间的细微差别。模板应该有一个规范来确切地定义它的作用,而部分应该有它自己的规范来确切地定义它的作用。
【解决方案2】:

我意识到这是一个古老的讨论,但我在遇到类似问题时遇到了它,所以也许我的解决方案会对其他人有所帮助。

我的问题是我的模拟方法没有被调用,因为我没有得到正确的“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", :locals => {:f => f}

但我的规范是在嘲笑:

render :partial => "form"

很自然,我的模拟方法不会被调用。意识到这一点后,我开始尝试模拟 form_for 以及其他各种东西,但解决方案要容易得多:

template.should_receive(:render).
  with(hash_including(:partial => "form")).
    and_return("<span id=\"rendered-form\"/>")

hash_include() 是缺少的。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多