2010-12-08 6 views
0

L'environnement est Sinatra, Nokogiri, RSpec, FactoryGirl et DataMapper.RSpec & DataMapper: Comment stub la méthode finder correctement

Le problème est lié au sérialiseur de DataMapper. Je ne sais pas comment l'absorber correctement.

Le code problématique:

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 

Le code qui get appels est pratiquement équivalent:

Municipality.all.to_xml 

Le problème est que le type du jeu de résultats est DataMapper::Collection qui a la méthode #to_xml.

Mon stub ne fonctionne pas forcément car j'utilise un Array d'instances stubbed, au lieu d'un DataMapper::Collection.

Ma question est:

Comment dois-je créer une collection d'instances (avec factorygirl) sont de type DataMapper::Collection et ont la méthode #to_xml fournie par le sérialiseur DataMapper?

Le code est également disponible sur GitHub:

Répondre

1

Eh bien, vous ne le faites pas.

Parce que nous savons que:

  • .all va toujours retourner un DataMapper::Collection
    • Il devrait être testé dans différentes unités test
  • .to_xml renvoie toujours une représentation XML de collection
    • Il doit être testé dans l'unité de diffenent test qui n'a rien à voir avec HTTP get etc.

Ainsi, nous pouvons cesser de tester tout dans un seul test et le diviser.

Qu'est-ce que vous voulez vraiment tester ici est si le contrôleur appelle à Municipality.all ET .to_xml puis pour la collecte, il retourne quand il get appelé avec GET "/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 

Le code ci-dessus est peut-être un peu pseudo.

+0

Ok! Merci d'avoir élargi ma vision! :) –

Questions connexes