2012-03-13 65 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是使用此方法显示的示例代码。