rspec 使用 draper Decorator 测试视图

Posted

技术标签:

【中文标题】rspec 使用 draper Decorator 测试视图【英文标题】:Test view by rspec with draper Decorator 【发布时间】:2012-03-13 09:41:13 【问题描述】:

我尝试使用 Rspec 测试我的观点。在我看来,我有一个由 Draper 生成的装饰器。这个装饰器是由正直的_exposure gem 暴露出来的。

我这样创建我的 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

在我的助手的存根中,我生成了 Draper 装饰器。在这个装饰器中,我有方法可以调用一些助手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

我不希望我的装饰器对所有助手调用存根。那我该怎么办?

【问题讨论】:

这并不能直接回答您的问题,但为什么要使用装饰器测试您的观点?为什么不单独测试装饰器?换句话说,只是断言#region_link 返回预期的HTML? (这就是我在我的一个应用程序中测试装饰器的方式)。 我在装饰器测试中做。我测试视图以确保我在装饰器上实现了我的视图所需的所有方法。 【参考方案1】:

我们需要像装饰器规范一样添加设置: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

【讨论】:

【参考方案2】:

另一种方法可能是使用 rspec 和 capybara 单独测试装饰器类。 Here 是显示使用这种方法的示例代码。

【讨论】:

以上是关于rspec 使用 draper Decorator 测试视图的主要内容,如果未能解决你的问题,请参考以下文章

Rails Draper 的装饰器导致 ArgumentError

ruby 在draper装饰器中进行I18n懒惰查找

我无法使用 'bundle exec rspec' 执行 rspec

ruby [rspec]“使用RSpec测试Rails程序”笔记

RSpec vs Cucumber(RSpec 故事)[关闭]

SystemStackError - 堆栈级别太深;在 Rspec 测试中,使用acts_as_audited、Rspec、数据库清理器