2010-12-08 11 views
0

環境はSinatra、Nokogiri、RSpec、FactoryGirl、およびDataMapperです。RSpec&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 

問題は、結果セットの型が#to_xml方法を有するDataMapper::Collectionであることです。

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

私の質問は:

どのように私はタイプDataMapper::Collectionのものであり、DataMapperののシリアライザによって提供さ#to_xml方法を持っている(FactoryGirl付き)インスタンスのコレクションを作成する必要がありますか?

コードはGitHubのでもご覧になれます。

答えて

1

さて、あなたはしないでください。

私たちがいることを知っているので:

  • .allが常に返されますDataMapper::Collection それは違うユニット試験で試験されなければならない
  • .to_xmlは常にコレクションのXML表現を返します。
    • これはdiffenent 単位でHTTP GETなど

だから我々は1回のテストですべてのテストを中止し、それを分割することができますとは何の関係もありませんテストをテストする必要があります。コントローラはMunicipality.allを要求し、それが上記のコードは多分ある"/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 

のGETとの呼ばを取得すると、その後.to_xmlは、コレクションのためにそれを返す場合

あなたが本当にここテストしたいことはありますやや擬似。

+0

私のビジョンを広げてくれてありがとう! :) –

関連する問題