我和我的团队一直在为 Rails 2.3 应用程序(Redmine,目前是 1.1 分支)大量生产插件。到目前为止,我们通过将大部分更改编写为 Rails 插件来避免污染 Redmine 的基本代码。这有两个主要好处:
- 大多数时候,与较新的 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
那里对类进行猴子补丁。
有没有办法从插件中修补 Rails 测试?
更新:仍然是一个悬而未决的问题。在http://www.redmine.org/boards/1/topics/23672上提供