0

私と私のチームは、Rails 2.3 アプリ (Redmine、現在は 1.1 ブランチ) 用のプラグインを大量に作成してきました。これまでのところ、ほとんどの変更を Rails プラグインとして作成することで、Redmine の基本コードを汚染することはありませんでした。これには、次の 2 つの主な利点があります。

  • ほとんどの場合、新しい Redmine バージョンとの統合は簡単です。
  • プラグインをドロップ/削除することで、いくつかのカスタム動作を有効/無効にすることができます。実際、これは私たちにとって重要な要素です。なぜなら、私たちのクライアントはまったく異なる要件を持っているからです。

私たちのプラグインのいくつかは、Redmine のクラスにモンキー パッチを適用します。たとえば、より厳密な検証をIssueモデルに「注入」するプラグインがあります:はstart_date、課題に必要です。due_dateestimated_hoursleaf?

このモンキーパッチは、いくつかのテストを失敗させたり、例外を発生させたりします。たとえば、このプラグインはクラスから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で利用できるようにする

4

1 に答える 1

1

Redmine または ChiliProject プラグインを作成するときは常に、次のことを前提としています。

  • プラグインのテストは単独で実行されます (プラグイン ディレクトリ内)。
  • プラグインは、コア テストが失敗するほどコア コードを変更する可能性があります。

コア テストにパッチを適用することで、他のユーザーがこの問題を回避できるように支援しようとしましたが、良い解決策が見つかりませんでした。テストがコアで変更されるか、別のプラグインが何かを壊すか、または何か他のものです。テストでインターフェースのモックを作成しようとさえしましたが、それらを維持するのは時間の無駄でした。

私が推奨する(そして行う)ことは次のとおりです。

  1. コア以外のプラグインをすべて削除する
  2. コア テストに合格することを確認する
  3. PluginA をインストールする
  4. PluginA のディレクトリに cd します
  5. PluginA のテストを分離して実行する

(そして、PluginA と PluginB の両方がインストールされていると、後で問題が発生する可能性があります)

申し訳ありませんが、より良い解決策はありません。

于 2011-05-04T22:42:11.403 に答える