Есть ли способ обезьяньего исправления тестов rails из плагинов?

#ruby-on-rails #plugins #redmine #redmine-plugins

#ruby-on-rails #Плагины #redmine #redmine-плагины

Вопрос:

Я и моя команда активно разрабатывали плагины для приложения 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
  

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

 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 класс там.

Есть ли способ обезьяньего исправления тестов rails из плагинов?

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

Ответ №1:

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

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

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

Что я рекомендую (и делаю), так это:

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

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

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