Есть ли способ сделать тесты рельсов monkey-patch из плагинов?

Я и моя команда много работали над плагинами для приложения Rails 2.3 (Redmine, в настоящее время ветка 1.1). Пока что мы избежали загрязнения базового кода Redmine, написав большинство наших изменений в виде подключаемых модулей rails. У этого есть два основных преимущества:

  • В большинстве случаев интеграция с новыми версиями Redmine проста.
  • Мы можем включить / отключить какое-то настраиваемое поведение, отбросив / удалив плагин. Фактически, это ключевой фактор для нас, потому что у наших клиентов совершенно разные требования.

Некоторые из наших плагинов обезьяны исправляют классы Redmine. Например, у нас есть плагин, который «вводит» более строгие проверки в модель Issue: start_date, due_date и estimated_hours требуются для leaf? проблем.

Эта штука с обезьяньим патчем приводит к сбою нескольких тестов и / или возникновению исключений. Этот самый плагин, например, заставляет метод create_issue! из класса IssueNestedSetTest создавать недопустимые проблемы (то есть не имея необходимых атрибутов, которые плагин применяет):

# Helper that creates an issue with default attributes
def create_issue!(attributes={})
  Issue.create!({:project_id => 1, :tracker_id => 1, :author_id => 1, :subject => 'test'}.merge(attributes))
end

Поскольку плагин может быть активным или неактивным, мы не хотели бы изменять сам тест. Мы думаем, что лучше всего, если плагин обезьяна исправит тест соответствующим образом:

module StandardTestPatches
  module InstanceMethods
    def create_issue_with_gespro_standards!(attributes={})
      attributes.merge!(:start_date => 1.day.ago, :due_date => 1.day.from_now, :estimated_hours => 8)
      create_issue_without_gespro_standards!(attributes)
    end
  end

  def self.included(base)
    base.send :include, InstanceMethods
    base.class_eval do
      alias_method_chain :create_issue!, :gespro_standards
    end
  end
end

Однако, поскольку файл init.rb нашего плагина требуется до загрузки классов тестов, мы не можем исправить там класс IssueNestedSetTest.

Есть ли способ сделать тесты рельсов monkey-patch из плагинов?

ОБНОВЛЕНИЕ: все еще открытый вопрос. Сделать его доступным на http://www.redmine.org/boards/1/topics/23672


person manu    schedule 21.04.2011    source источник


Ответы (1)


Когда я пишу плагины Redmine или ChiliProject, я всегда предполагаю, что:

  • тесты плагинов будут запускаться сами по себе (внутри каталога плагинов)
  • плагин может изменить основной код настолько, что основные тесты не пройдут

Я пытался помочь другим обойти это, исправляя основные тесты, но мы так и не нашли хорошего решения. Либо тест изменится в ядре, либо другой плагин что-то сломает, либо что-то еще. Я даже пытался имитировать интерфейсы в тестах, но их поддержание было убийцей времени.

Я рекомендую (и делаю):

  1. Удалите все неосновные плагины
  2. Убедитесь, что основные тесты пройдены
  3. Установить PluginA
  4. cd в каталог PluginA
  5. Запускать тесты PluginA изолированно

(И вы можете столкнуться с проблемами позже, если будут установлены PluginA и PluginB)

Извините, лучшего решения нет.

person Eric Davis    schedule 04.05.2011