我和我的团队一直在为Rails 2.3应用程序(Redmine,目前是1.1分支)大量生成插件。到目前为止,我们通过将大部分更改写为rails插件来控制Redmine的基本代码。这有两个主要好处:
我们的一些插件猴子补丁Redmine的类。例如,我们有一个插件可以为Issue
模型“注入”更严格的验证:start_date
,due_date
和estimated_hours
是leaf?
问题所必需的。< / p>
这种猴子修补程序使得多次测试失败和/或引发异常。例如,这个插件使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
提供答案 0 :(得分:1)
每当我写Redmine或ChiliProject插件时,我总是认为:
我试图通过修补核心测试来帮助其他人解决这个问题,但我们从来没有找到一个好的解决方案。测试会在核心中发生变化,另一个插件会破坏某些东西,或其他东西。我甚至试图模拟测试中的接口,但维护它们是时间杀手。
我推荐(和做)是:
(如果同时安装了PluginA和PluginB,您可能会遇到问题)
抱歉没有更好的解决方案。