2009-12-12 68 views
1

我正在爲View編寫規範,它有一個在佈局中呈現的菜單(在部分中)。我想爲選定的菜單編寫規格。下面是該規範是失敗的代碼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.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")

感謝和問候, Pravin。

+0

「do_render」的定義是什麼? – 2009-12-15 16:59:54

回答

2

我不認爲這行:

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

是做什麼的,你覺得它在做什麼。 RSpec不會調用template.render:partial =>「layouts/admin/menu」。當渲染被調用時,它只會渲染渲染並返回{:partial =>「layouts/admin/menu」}。

爲什麼存根渲染?您希望視圖實際呈現,以便響應主體擁有您想要測試的數據,除非我錯過了某些東西,我可能會這樣做。 :)

+0

至於爲什麼存根渲染,你不應該因爲它是危險的。您的模板可能會開始調用render(),並且您的規範不會捕獲它們。 – jtanium 2011-01-05 12:50:13

+1

忽略我上面的評論,這是它應該說的: 至於爲什麼存根渲染,這是spec'ing和測試之間的細微差別。該模板應該有一個規範,完全定義它*做了什麼,部分應該有它自己的規範,它完全定義*它的功能。 – jtanium 2011-01-05 12:59:42

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()是少了什麼。

所以也許你的問題是相似的:你並沒有真正嘲笑你認爲你在嘲笑什麼。