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
我无法使用 'bundle exec rspec' 执行 rspec
ruby [rspec]“使用RSpec测试Rails程序”笔记
RSpec vs Cucumber(RSpec 故事)[关闭]
SystemStackError - 堆栈级别太深;在 Rspec 测试中,使用acts_as_audited、Rspec、数据库清理器