Как настроить пользовательскую группу примеров RSpec 1? - PullRequest
0 голосов
/ 27 февраля 2012

Я использую RSpec 1 и rspec-rails для тестирования моего приложения Rails 2.3.14. В этом же приложении я использую Draper для предоставления декораторов для моих моделей. Я хочу иметь возможность проверить мои декораторы.

У меня есть спецификации в spec/decorators, но, насколько я могу судить, потому что rspec-rails не распознает декораторы / путь и, следовательно, не связывает какие-либо дополнительные вещи Rails в спецификации .

Как настроить RSpec для распознавания моего пути spec/decorators и включения в него необходимых мне функций (которые будут функциональностью маршрута / помощника)?

Я замечаю, что в RSpec есть такие вещи, как HelperExampleGroup, ControllerExampleGroup и т. Д., И я подозреваю, что они неявно отображаются на spec/helpers и spec/controllers и тому подобное, но я неясно, как использовать это для настроить свой собственный DecoratorHelperGroup.

Мне кажется, что я нахожусь на 90% пути, но не могу установить эту последнюю связь. Примеры были бы наиболее ценными, но я также возьму реферат.

1 Ответ

1 голос
/ 27 февраля 2012

Решил это. Волшебный соус 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 для использования текущего описанного класса декоратора для украшения произвольного объекта, что позволяет легко декорировать объекты для тестирования. Миссия выполнена!

...