2010-11-23 23 views
13

J'essaie de tester si dans une chaîne d'appel de méthode l'une des méthodes obtient un paramètre spécifique. Dans le code ci-dessous par exemple MyModel doit recevoir le paramètre 0 pour la méthode offset. Malheureusement, le code ci-dessous ne fonctionne pas. Il semble qu'il ne soit pas possible de mélanger should_receive et stub_chain. Comment pourrais-je résoudre ceci? J'utilise RSpec 2.stub_chain avec should_receive

MyModel.should_receive(:offset).with(0).stub_chain(:tag_counts, :offset, :limit, :order).and_return([]) # does not work! 

Le code que je suis en train de tester:

tags = taggable.tag_counts.offset(page-1).limit(per_page).where(*where_clause).order("count DESC") 

Mise à jour

J'ai également signalé la question sur le groupe Google RSpec ont été David (le créateur de RSpec) a répondu (merci David): http://groups.google.com/group/rspec/browse_thread/thread/6b8394836d2390b0?hl=en

Répondre

8

Ceci est un exemple de ce que je fais dans l'une de mes spécifications maintenant. Il est un peu incommode (cause des nombreuses lignes), mais cela fonctionne:

SearchPaginationModel.stub(:tag_counts) { SearchPaginationModel } 
SearchPaginationModel.should_receive(:offset).with(0) { SearchPaginationModel } 
SearchPaginationModel.stub_chain(:limit, :where, :order) { [] } 
SearchPaginationModel.stub_chain(:tag_counts, :where, :count).and_return(1) 
SearchPaginationModel.search_tags(:page => "1") 

Ce par exemple des tests en SearchPaginationModel.tag_counts.offset(0).limit(X).where(X).order(X) que vraiment offset 0 est définie.