2

モックオブジェクトの#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の目的ですか?

4

1 に答える 1

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

私はしばらくの間Remarkableを使用していて、これを指定するのが本当に簡単になります。

describe Letter
  should_belong_to :to, :polymorphic => true
end
于 2009-04-25T14:42:14.380 に答える