【问题标题】:Is there a way to monkey-patch rails tests from plugins?有没有办法从插件中修补 Rails 测试?
【发布时间】:2011-08-10 01:12:50
【问题描述】:

我和我的团队一直在为 Rails 2.3 应用程序(Redmine,目前是 1.1 分支)大量生产插件。到目前为止,我们通过将大部分更改编写为 Rails 插件来避免污染 Redmine 的基本代码。这有两个主要好处:

  • 大多数情况下,与新版本的 Redmine 集成很简单。
  • 我们可以通过删除/删除插件来启用/禁用某些自定义行为。事实上,这对我们来说是一个关键因素,因为我们的客户有着截然不同的要求。

我们的一些插件猴子补丁 Redmine 的类。例如,我们有一个插件可以向Issue 模型“注入”更严格的验证:leaf? 问题需要start_datedue_dateestimated_hours

这种猴子修补的东西会使几个测试失败和/或引发异常。例如,这个插件使 IssueNestedSetTest 类中的 create_issue! 方法创建无效问题(即缺少插件强制执行的必需属性):

# 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 上提供它

【问题讨论】:

    标签: ruby-on-rails plugins redmine redmine-plugins


    【解决方案1】:

    每当我编写 Redmine 或 ChiliProject 插件时,我总是假设:

    • 插件的测试将自行运行(在插件目录内)
    • 插件可能会修改核心代码,导致核心测试失败

    我试图通过修补核心测试来帮助其他人解决这个问题,但我们从未找到一个好的解决方案。要么测试会改变核心,另一个插件会破坏某些东西,或者其他东西。我什至试图在测试中模拟出接口,但维护它们是一个时间杀手。

    我推荐(和做)的是:

    1. 删除所有非核心插件
    2. 检查核心测试是否通过
    3. 安装插件A
    4. cd 到 PluginA 的目录
    5. 单独运行 PluginA 的测试

    (如果同时安装了 PluginA 和 PluginB,您以后可能会遇到问题)

    抱歉,没有更好的解决方案。

    【讨论】:

      猜你喜欢
      • 2023-03-30
      • 2020-03-18
      • 1970-01-01
      • 2015-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-09
      相关资源
      最近更新 更多