2010-11-23 14 views
13

Ich versuche zu testen, ob in einer Methode Aufrufkette eine der Methoden einen bestimmten Parameter erhalten. Im folgenden Code muss MyModel beispielsweise den Parameter 0 für die Methode offset erhalten. Leider funktioniert der folgende Code nicht. Es scheint, dass es nicht möglich ist, sust_receive und stub_chain zu mischen. Wie könnte ich das lösen? Ich verwende RSpec 2.stub_chain zusammen mit soll_receive

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

Der Code, den ich zu Test versuchen:

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

aktualisiert

ich auch die Frage nach der RSpec Google-Gruppe wurde David geschrieben (der Schöpfer von RSpec) beantwortete es (danke David): http://groups.google.com/group/rspec/browse_thread/thread/6b8394836d2390b0?hl=en

Antwort

8

Dies ist ein Beispiel, was ich in einer meiner Spezifikationen jetzt mache. Es ist ein bisschen unhandlich (Ursache der vielen Linien), aber es funktioniert:

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") 

Dies zum Beispiel Tests in SearchPaginationModel.tag_counts.offset(0).limit(X).where(X).order(X), die wirklich offset 0 gesetzt.