对象Presenter中的Rspec测试Haml模板输出

时间:2016-05-25 00:46:05

标签: ruby-on-rails templates testing rspec haml

我试图找出我应该在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

0 个答案:

没有答案