2009-04-19 4 views
2

私はモックオブジェクトの#classメソッドをスタブにしたいと思います:Ruby on RailsアプリケーションでRSpecを使用する場合、Mockオブジェクトの#classメソッドをスタブすることはできますか?

describe Letter do 
    before(:each) do 
    @john = mock("John") 
    @john.stub!(:id).and_return(5) 
    @john.stub!(:class).and_return(Person) # is this ok? 
    @john.stub!(:name).and_return("John F.") 
    Person.stub!(:find).and_return(@john) 
    end 
    it.should "have a valid #to field" do 
    letter = Letter.create!(:to=>@john, :content => "Hello John") 
    letter.to_type.should == @john.class.name 
    letter.to_id.should == @john.id 
    end 
    [...] 
end 

は、このプログラムの5行目で、私は@ john.class.nameのようなものを可能にするために、#classメソッドスタブ。これは正しい方法ですか?悪い副作用はありますか?

編集:

文字クラスは、次のようになります。フィールドのクラス名にto.class.nameまたは他の手段によって:

class Letter < ActiveRecord::Base 
    belongs_to :to, :polymorphic => true 
    [...] 
end 

私はActiveRecordのが取得するかどうかを疑問に思います。多分、これはclass_nameメソッドがActiveRecord :: Baseのためのものでしょうか?

+0

私はそれに対して法律の知識がない...私はそれは 'legal'だと思う;):) –

+0

私は刑務所に行くのが怖かった! ;-) – MiniQuark

答えて

3

この特定のケースではmock_modelを使用してください。 あなたbefore(:each)は、次のようになります。

before(:each) do 
    @john = mock_model(Person, :name => "John F.") 
    Person.stub!(:find).and_return(@john) 
end 

は、その後、あなたの他の質問には、あなたが本当にRailsはあなたの行動をテストするためにどのように動作するかを気にしてはいけません。私はto_typeフィールドとto_idフィールドを自分でテストすることをお勧めしません。これはRailsの振る舞いであり、あなたのプロジェクトではなくRailsでテストする必要があります。

IしばらくRemarkableを使用して、それを指定し、これは本当に簡単ですされています:

describe Letter 
    should_belong_to :to, :polymorphic => true 
end 
+0

すばらしい答え、tx。 – MiniQuark

+1

@MiniQuarkこれは、すべての後にも便利だった:) –

関連する問題