0

環境はSinatra、Nokogiri、RSpec、FactoryGirl、DataMapperです。

問題は、DataMapper のシリアライザーにあります。それを適切にスタブする方法がわかりません。

問題のあるコード:

specify 'should return an xml array of all municipalities' do
    municipalities = []
    10.times { |n| municipalities << Factory.build(:municipality, :code => "Municipality no #{n}") }
    Municipality.stub!(:all).and_return(municipalities)
    get "/municipalities.xml"
 #  ^------- KABOOM!
 #  [.. rest of code clipped out ..]
 end

getを呼び出すコードは、次のものと実質的に同等です。

 Municipality.all.to_xml

問題は、結果セットのタイプがメソッドDataMapper::Collectionを持っていることです。#to_xml

Arrayの代わりにスタブ化されたインスタンスのを使用しているため、私のスタブは明らかに機能しませんDataMapper::Collection

私の質問は:

DataMapper::Collectionタイプであり、#to_xmlDataMapper のシリアライザーによって提供されるメソッドを持つインスタンスのコレクション (FactoryGirl を使用) を作成するにはどうすればよいですか?

コードは Github でも入手できます。

4

1 に答える 1

1

まあ、あなたはしません。

私たちはそれを知っているからです:

  • .allは常に a を返しますDataMapper::Collection
    • 別の単体テストでテストする必要があります
  • .to_xml常にコレクションの XML 表現を返します
    • HTTP get などとは関係のない別の単体テストでテストする必要があります

したがって、1 つのテストですべてをテストするのをやめて、分割することができます。

ここで本当にテストしたいのは、コントローラーが Municipality.all を呼び出してから、コレクションの .to_xml を呼び出すかどうかです。"/municipalities.xml"

specify 'should return an xml array of all municipalities' do
  collection = mock(DataMapper::Collection (or anything, its not really interesting here))
  collection.should_receive(:to_xml).and_return(xml_if_needed_for_view)

  Municipality.should_receive(:all).and_return(collection)

  get "/municipalities.xml"
end

上記のコードは、多少擬似的なものです。

于 2010-12-08T12:02:26.720 に答える