我试图找出我应该在Rspec中使用的类/方法/实例化过程,以获得一个包含标准ActionView herlper方法和HAML帮助方法的功能视图模板。
我已经在我的rails应用中实现了演示者,就像在RailsCast #287
中一样我有一个演示者,我想做一些使用其中一个HAML助手的输出。
以下是基本演示者:
class BasePresenter
attr_reader :object, :template
def initialize(object, template)
@object = object
@template = template
end
end
以下是理论上可呈现对象的示例及其演示者类:
class FakeObject
def a_number
rand(10).to_s
end
end
class FakePresenter < BasePresenter
def output_stuff
# #content_tag is standard ActionView
template.content_tag(:span) do
# #succeed is from the haml gem
template.succeed('.') do
object.a_number
end
end
end
end
如果我要在Rspec中为此编写一个测试,并且只使用了#content_tag方法,那么这将起作用,因为它是ActionView的一部分。但是,#succeed来自haml gem,并且在目前的测试中无法使用。
测试:
require 'rails_helper'
describe FakeObjectPresenter do
let(:template){ ActionView::Base.new }
let(:obj){ FakeObject.new }
let(:presenter){ FakeObjectPresenterPresenter.new obj, template }
describe '#output_stuff' do
it{ expect(presenter.output_stuff).to match(/<span>\d+<\/span>/) }
end
end
故障:
1) FakeObjectPresenter #output_stuff
Failure/Error:
template.succeed('.') do
object.a_number
NoMethodError:
undefined method `succeed' for #<ActionView::Base:0x00560e818125a0>
我应该将哪个类作为模板而不是ActionView :: Base.new进行实例化以获取测试中可用的haml方法?
如果您想轻松使用此功能,可以将以下代码转储到rails应用中的spec.rb文件中并将其作为演示版运行:
require 'rails_helper'
# Define classes to be tested
class FakeObject
def a_number
rand(10).to_s
end
end
class BasePresenter
attr_reader :object, :template
def initialize(object, template)
@object = object
@template = template
end
end
class FakeObjectPresenter < BasePresenter
def output_stuff
# #content_tag is standard ActionView
template.content_tag(:span) do
# #succeed is from the haml gem
template.succeed('.') do
object.a_number
end
end
end
end
# Actual spec
describe FakeObjectPresenter do
let(:template){ ActionView::Base.new }
let(:obj){ FakeObject.new }
let(:presenter){ FakeObjectPresenter.new obj, template }
describe '#output_stuff' do
it{ expect(presenter.output_stuff).to match(/<span>\d+<\/span>/) }
end
end