我正在为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
此规范失败。我没有正确的方法为partials编写规范,我尝试过:
template.should_receive(:render).with(:partial => "/layout/admin/menu")
也是。
谢谢和问候, 普拉。
答案 0 :(得分:2)
我不认为这一行:
template.stub!(:render).and_return(:partial => "layouts/admin/menu")
正在做你认为它正在做的事情。 RSpec不打算调用template.render:partial => “布局/管理/菜单”。它只是将渲染并返回{:partial =>调用render时的“layouts / admin / menu”}。
为什么存根渲染?您希望视图实际呈现,以便响应主体具有您要测试的数据,除非我遗漏了某些内容,我可能会这样做。 :)
答案 1 :(得分:1)
我意识到这是一个古老的讨论,但我在遇到类似问题时遇到过它,所以也许我的解决方案会帮助其他人。
我的问题是我被嘲笑的方法没被调用,因为我没有得到“有”权利。这就是我所拥有的,这是无效的:
# 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_including()是缺少的。
所以也许你的问题很相似:你并不是在嘲笑你认为自己在嘲笑的事情。