2009-12-12 4 views
1

Я пишу спецификации для View, у которого есть меню (которое частично), отображаемое в макете. Я хочу написать спецификации для выбранного меню. Вот кодПроблема с частичными частицами Rspec

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") тоже.

Thanks and regards, Pravin.

+0

Какое определение «do_render»? –

ответ

2

Я не думаю, что эту линию:

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

делает то, что вы думаете, что он делает. RSpec не собирается вызывать template.render: partial => «layouts/admin/menu». Он просто закроет рендер и вернет {: partial => "layouts/admin/menu"}, когда вызывается рендер.

Почему режущий пластик вообще? Вы хотите, чтобы представление фактически отображалось так, что тело ответа имеет те данные, которые вы хотите проверить, если только я не упустил что-то, что я могу. :)

+0

Относительно того, почему вырезать вообще, вы не должны, потому что это опасно. Ваш шаблон может начинать делать вызовы render(), и ваш spec их не поймает. – jtanium

+1

Игнорируйте мой комментарий выше, это то, что он должен сказать: Что касается того, что жетог рендеринга вообще, это тонкая разница между spec'ing и тестированием. Шаблон должен иметь спецификацию, которая точно определяет *, что она делает, а частичная должна иметь свою собственную спецификацию, которая точно определяет *, что она делает. – jtanium

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() было то, что не хватало.

Так что, может быть, ваша проблема схожа: вы на самом деле не издеваетесь над тем, что думаете, что вы издеваетесь.

Смежные вопросы