2


2

Ruby on RailsアプリケーションでRSpecを使用するときにMockオブジェクトの#classメソッドをスタブ化することは合法ですか?

モックオブジェクトの#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メソッドをスタブしています。 これは正しいやり方ですか? 悪い副作用はありますか?

編集:

Letterクラスは次のようになります。

class Letter < ActiveRecord::Base
    belongs_to :to, :polymorphic => true
    [...]
end
ActiveRecordが:toフィールドのクラス名を `to.class.name`で取得するのか、それとも他の方法で取得するのか疑問に思います。 たぶんこれはclass_nameメソッドがActiveRecord

Baseであるものなのでしょうか?

1 Answer


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でテストする必要があります。

私はしばらくの間http://remarkable.rubyforge.org/ [Remarkable]を使用してきましたが、これを指定するのはとても簡単です。

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