私と私のチームは、Rails 2.3 アプリ (Redmine、現在は 1.1 ブランチ) 用のプラグインを大量に作成してきました。これまでのところ、ほとんどの変更を Rails プラグインとして作成することで、Redmine の基本コードを汚染することはありませんでした。これには、次の 2 つの主な利点があります。
- ほとんどの場合、新しい 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
そこでクラスにモンキー パッチを適用することはできません。
プラグインからレール テストにモンキー パッチを適用する方法はありますか?
更新: まだ未解決の質問です。http://www.redmine.org/boards/1/topics/23672で利用できるようにする