[rspec-users] Setting expections on chained calls

Justin Ko jko170 at gmail.com
Mon Nov 7 13:37:50 EST 2011


On Nov 2, 2011, at 12:01 PM, Rob Aldred wrote:

> 
> I'm pretty sure this has probably been discussed before.
> I'm using couchdb (couchrest_model)
> 
> When speccing my controller i want to set expectations that im calling my couch views correctly.
> The query interface has recently been updated to work very similar to ARel
> 
> This means i have to rewrite some of my specs.
> 
> Old call:
> 
>    Exam.by_created_at_and_not_archived(:start_key => [@exam.created_at], :endkey => ['0'],:limit => 2)
> 
> I set an expectation on that easily like so:
> 
>    Exam.should_receive(:by_created_at_and_not_archived).
>          with(:startkey => [@exam1.created_at],:endkey => ['0'],:limit => 2).
>          and_return([@exam1, at exam2])
> 
> However the new api i doesn't seem that easy to work with:
> 
>    Exam.by_created_at_and_not_archived.startkey([@exam.created_at]).endkey(['0']).limit(2)
> 
> I could use stub_chain, but that doesn't allow me to check the params being passes to the calls other than the last.
> I could also create a wrapper method on my Exam model that is called from the controller with hash params,
> however that just shifts the problem, I then have to check the expections in the model spec instead.
> 
> Suggestions on how best to go about that would be appreciated.
> 
> 
> 
> 
> _______________________________________________
> rspec-users mailing list
> rspec-users at rubyforge.org
> http://rubyforge.org/mailman/listinfo/rspec-users

Exam.should_receive(:by_created_at_and_not_archived).and_return(
  double('startkey').tap {|startkey|
    startkey.should_receive(:startkey).with([@exam.created_at]).and_return(
      double('endkey').tap {|endkey|
        endkey.should_receive(:endkey).with(['0']).and_return(
          double('limit').tap {|limit|
            limit.should_receive(:limit).with(2).and_return([@exam1, @exam2])
          }
        )
      }
    )
  }
)

LOL, this is the ugliest code I've written all year. You'd might want to use variables for readability:

endkey = double('endkey')

startkey = double('startkey')
startkey.should_receive(:start key).with([@exam.created_at]) { endkey }


More information about the rspec-users mailing list