[rspec-users] should_receive(:x).at_most/exactly... ignored when method is previously stubbed?

Lenny Marks lenny at aps.org
Tue Dec 1 12:39:25 EST 2009


Forgot to mention: rspec 1.2.9

On Dec 1, 2009, at 11:46 AM, Lenny Marks wrote:

> I've always used the idiom of stub collaborations in a before block  
> and then focus in specific examples with should_receive. (e.g.  
> should_receive takes presence over stub). I was just attempting to  
> write an example for caching behavior and ran into something counter- 
> intuitive, at least IMHO.  See the following(contrived) example.
>
> class ExpensiveOperation
>   def self.lookup(question)
>      "This goes to the database"
>   end
> end
>
> class UsesExpensiveOperation
>   def initialize
>      @cache = {}
>   end
>
>   def answer_for(question)
>      # oops, this is broken, it was supposed to be cached
>      # @cache[question] ||= ExpensiveOperation.lookup(question)
>      @cache[question] = ExpensiveOperation.lookup(question)
>   end
> end
>
> describe "suprising behavior" do
>   before do
>      @object = UsesExpensiveOperation.new
>
>      ExpensiveOperation.stub(:lookup).and_return('whatever')
>   end
>
>   it "should fail because I'm specifying that lookup should be  
> called at most one time, but that's not true" do
>       
> ExpensiveOperation 
> .should_receive(:lookup).at_most(:once).and_return('an answer')
>
>      @object.answer_for("my question")
>      @object.answer_for("my question")
>   end
>
> end
>
> This seems dangerous to me. Assuming I hadn't initially stubbed in  
> the before block and everything worked as expected, if someone later  
> stubs :lookup in the before block because they are adding new  
> examples that don't care about it, my explicit example becomes  
> misleadingly useless.
>
> Does this surprise anyone else?
>
> -lenny
> _______________________________________________
> rspec-users mailing list
> rspec-users at rubyforge.org
> http://rubyforge.org/mailman/listinfo/rspec-users
>



More information about the rspec-users mailing list