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