2012-03-13 64 views
2

我嘗試使用Rspec測試我的視圖。在我看來,我有Draper生成的裝飾器。這個裝飾是由decent_exposure寶石公佈。rspec使用draper測試視圖Decorator

創建我的RSpec的測試這樣的:

require 'spec_helper' 

describe "boats/show.html.slim" do 

    let(:boat_decorate) { BoatDecorator.new(get_boat) } 
    let(:search) { Search.new } 

    before do 
    view.stub(:boat_decorate) { boat_decorate } 
    view.stub(:search) { search } 
    render :template => 'boats/show.html.slim' 
    end 

    it 'should see titlte' do 
    rendered.should have_selector(:h1, :content => boat_decorate.title) 
    end                                             
end 

在我的幫助我的存根我產生德雷珀裝飾。在這個裝飾我有方法來打電話給一些幫手link_to

class BoatDecorator < ApplicationDecorator 

    decorates :boat 

    def region_link 
    h.link_to region_name, '#', :title => region_name                                 
    end 

end 

但如果我啓動這個測試我有一個錯誤:

1) boats/show.html.slim should see titlte 
    Failure/Error: render :template => 'boats/show.html.slim' 
    ActionView::Template::Error: 
     undefined method `link_to' for nil:NilClass 

我不想做存根通過我的所有裝飾助手呼籲。那我該怎麼辦?

+0

這並不直接回答你的問題,但爲什麼用裝飾者測試你的意見?爲什麼不單獨測試裝飾者?換句話說,只是斷言'#region_link'返回期望的HTML? (這是我在我的一個應用程序中測試裝飾器的方式)。 – myabc 2012-03-13 09:56:21

+0

我在裝修測試中做到這一點。我測試視圖以確保我的裝飾器上實現了我的視圖所需的所有方法。 – shingara 2012-03-13 10:00:15

回答

6

我們需要做的像一個裝飾規範,並添加設置:ApplicationController.new.set_current_view_context

require 'spec_helper' 

describe "boats/show.html.slim" do 

    let(:boat_decorate) { BoatDecorator.new(get_boat) } 
    let(:search) { Search.new } 

    before do 
    ApplicationController.new.set_current_view_context 
    view.stub(:boat_decorate) { boat_decorate } 
    view.stub(:search) { search } 
    render :template => 'boats/show.html.slim' 
    end 

    it 'should see titlte' do 
    rendered.should have_selector(:h1, :content => boat_decorate.title) 
    end                                             
end 
0

另一種方法可以在隔離使用RSpec和水豚被測試的裝飾類。 Here是使用此方法顯示的示例代碼。