1

Rails をロードせずにテストを実行するようにリファクタリングするプロセスを開始しています。私のテストのほとんどは、レールをロードする標準の rspec テストです。私の問題は、以下のテスト ファイルで、他の多くのテスト ファイルで使用されている 1 つのクラスをオーバーライドしていることです。したがって、これらのテストに合格しても、他のテストは失敗します。ここで多くのアドバイスを得た後、その Project クラスをスタブ化することを検討しています。(プロジェクト クラスを必要とする他のすべてのテスト ファイルでプロジェクト クラスをリロードするよりも、このファイルでプロジェクト クラスをスタブしたいと思います。)

これが私が今持っているものです。

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


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

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

describe 'Project::Media' do
  #then all the tests

FakeProject クラスを作成し、Project::Media を FakeProject でスタブ化して Project::Media に継承させようとしましたが、うまくいきませんでした。これが私が持っているものです。

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


class FakeProject
  attr_accessor :general_media
  def initialize(attributes = {})
    @general_media = attributes[:general_media]
  end
  include ActiveModel::Validations    
  include ActiveRecord::Callbacks
end
class Project; end
require_relative '../../../app/models/project/media.rb'

describe 'Project::Media' do
  before(:all) { stub_constant!("Project", FakeProject) }

まず、私はまだプロジェクト クラスをオーバーライドしています。次に、stubbig が機能していません。検証が機能していないというエラーが引き続き表示されます。

undefined method `validate' for Project::Media:Class (NoMethodError)

助言がありますか?私の目標は、Project クラスがすべてのテストに対してどのように動作するかをオーバーライドするのではなく、この media_spec.rb テスト ファイル内のテストに対してのみ Project クラスをスタブ化することです。

4

1 に答える 1

14

rspec 構文を使用して Fake クラスを作成できます。何かのようなもの:

let(:fake_class) { Class.new }
stub_const("Project", fake_class)

そして、その Project クラスのメソッドをスタブ化したい場合は、次のようにすることができます:

dummy_class = Project # the same name that you used above
# stub any method and return anything that you want to return
dummy_class.stub_chain(:any_method).and_return(anything) 
于 2013-01-30T16:24:04.357 に答える