如何设置自定义RSpec 1示例组?

时间:2012-02-27 03:32:24

标签: ruby-on-rails rspec ruby-on-rails-2

我正在使用RSpec 1和rspec-rails来测试我的Rails 2.3.14应用程序。在同一个应用程序中,我使用Draper为我的模型提供装饰器。我希望能够测试我的装饰者。

我在spec/decorators中有规格,但是尽我所知,因为rspec-rails不能识别装饰器/路径,因此不会将任何额外的Rails内容连接到规格。

如何设置RSpec以识别我的spec/decorators路径,并使其包含我需要的功能(这将是路由/帮助功能)?

我注意到RSpec有HelperExampleGroupControllerExampleGroup等等,我怀疑这些内容会隐式映射到spec/helpersspec/controllers等等,但我是不清楚如何利用它来设置我自己的DecoratorHelperGroup

我觉得我有90%的方式,但不能完全建立最终的联系。例子最有价值,但我也会抽象。

1 个答案:

答案 0 :(得分:1)

解决了它。神奇的酱油是Spec::Example::ExampleGroupFactory.register

为了记录,这是我的完整spec/support/decorators.rb

module Spec
  module Rails
    module Example
      class DecoratorExampleGroupController < ApplicationController
        attr_reader :template

        def view_context
          template
        end
      end

      # spec/decorators
      class DecoratorExampleGroup < FunctionalExampleGroup
        if ActionView::Base.respond_to?(:load_helpers) # Rails 2.0.x
          ActionView::Helpers.constants.each do |name|
            const = ActionView::Helpers.const_get(name)
            include const if name.include?("Helper") && Module === const
          end
        elsif ActionView::Base.respond_to?(:helper_modules) # Rails 2.1.x
          ActionView::Base.helper_modules.each do |helper_module|
            include helper_module
          end
        else # Rails 2.2.x
          include ActionView::Helpers
        end

        tests DecoratorExampleGroupController

        class << self
          def decorate(options = {})
            self.subject { described_class.new(yield, options) }
          end
        end

        before :each do
          @controller.template.request = @request
          @controller.set_current_view_context
        end

        Spec::Example::ExampleGroupFactory.register(:decorator, self)

      protected
        def _assigns_hash_proxy
          @_assigns_hash_proxy ||= AssignsHashProxy.new(self) {@response.template}
        end
      end
    end
  end
end

所有这些有效的做法是在spec/decorators下注册规范以作为视图规范运行(这可以获得我需要的所有部分)。在每个装饰器规范之前,在控制器上调用#set_current_view_context会调用将助手连接到装饰器所需的Draper位。我还添加了一个decorate方法来使用当前描述的装饰器类来装饰任意对象,允许轻松装饰对象以进行测试。任务完成了!