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) }

  ...

サブジェクトが記述ブロックに依存している場合は、記述ブロックの前に Project クラスを宣言する必要があります。Mediaまた、モデルが必要になる前にモデルがそれに依存していると仮定します。

Project クラスの後のテストでは、それをリロードする必要があります。それらが個別のテストであると仮定するとrequire、最小限の (高速な) テストが必要な場合は、そのテスト ファイルでプロジェクト モデル クラスを使用できます。全体をロードする場合は、通常の spec_helper を使用します。 Rails アプリケーション (遅い)。

コメントで説明されているように、Project クラスを再定義するよりも単純にスタブ化する方が簡単な場合があります。

于 2013-01-29T17:46:43.330 に答える