我正在为视图编写规范,其中有一个菜单(这是在一个部分)在布局中呈现。我想为选定的菜单写规格。以下是代码
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")。
谢谢和问候,普雷文。
发布于 2009-12-16 00:57:05
我不认为这句话:
template.stub!(:render).and_return(:partial => "layouts/admin/menu")是在做你认为它在做的事情。RSpec不会调用template.render :partial => "layouts/admin/menu“。它只是在调用render时存根输出render并返回{:partial => "layouts/admin/menu"}。
为什么要使用存根渲染呢?您希望视图实际呈现,以便响应体包含您想要测试的数据,除非我遗漏了一些东西,我可能遗漏了一些东西。:)
发布于 2011-01-05 20:45:48
我意识到这是一个古老的讨论,但我在遇到类似的问题时遇到了它,所以也许我的解决方案会对其他人有所帮助。
我的问题是我的被嘲笑的方法没有被调用,因为我没有得到正确的"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_including()。
所以也许你的问题是相似的:你并不是真的在嘲笑你认为你在嘲笑的东西。
https://stackoverflow.com/questions/1893544
复制相似问题