0

我已经重构了我的测试套件的一部分,以便在执行测试时不加载轨道。下面的代码是一个测试文件的示例,它只加载 Rails 的选择片段。它还伪造了“项目”类。我的问题是这个伪造的项目类最终覆盖了正常的项目类,并且涉及该项目类的所有其他测试现在都失败了。

此测试文件运行后如何取消覆盖我的项目类?

require 'active_model'
require 'active_model/validations'
require 'active_record/callbacks'
require 'active_support/core_ext/string'
class Project
  include ActiveModel::Validations    
  include ActiveRecord::Callbacks
  def initialize(attributes = {})
    @general_media = attributes[:general_media]
  end
  attr_accessor :general_media
end

require_relative '../../../app/models/project/media.rb'

更新:我认为这接近我需要的,除了我收到关于 Project 是未初始化常量的错误。我一定是错误地实例化了这个测试类。

require 'active_model'
require 'active_model/validations'
require 'active_record/callbacks'
require 'active_support/core_ext/string' #used for '.blank?' method

require_relative '../../../app/models/project/media.rb'

describe Project::Media do
  before(:all) do 

    class Project
      include ActiveModel::Validations    
      include ActiveRecord::Callbacks
      def initialize(attributes = {})
        @general_media = attributes[:general_media]
      end
      attr_accessor :general_media
    end

  end

  after(:all) { Object.send(:remove_const, :Project) }

  #then all the tests
4

1 回答 1

1

您应该能够使用Module#remove_const.

Object.send(:remove_const, :Project)

它是一种私有方法,因此您需要使用send而不是常规方法调用。

更新:

也许尝试以下方法:

require 'active_model'
require 'active_model/validations'
require 'active_record/callbacks'
require 'active_support/core_ext/string' #used for '.blank?' method

class Project
  include ActiveModel::Validations    
  include ActiveRecord::Callbacks
  def initialize(attributes = {})
    @general_media = attributes[:general_media]
  end
  attr_accessor :general_media
end

require_relative '../../../app/models/project/media.rb'

describe Project::Media do

  after(:all) { Object.send(:remove_const, :Project) }

  ...

如果主题依赖于它,您将需要在描述块之前声明项目类。还假设您的Media模型在您需要之前依赖它。

Project 类的后续测试将需要重新加载它,假设它们是单独的测试require,如果您想要最小(快速)测试,您可以只在该测试文件中的项目模型类,或者如果您想要加载整个测试,则可以通过普通的 spec_helper Rails 应用程序(慢)。

正如评论中所讨论的,简单地存根 Project 类而不是重新定义它可能更容易。

于 2013-01-29T17:46:43.330 回答