[rspec-users] Stubbing Model.new w/ block?

David Chelimsky dchelimsky at gmail.com
Fri Apr 20 19:22:54 EDT 2007


On 4/20/07, James Hillyerd <james at hillyerd.com> wrote:
> I switched to using a real receipt when I couldn't get the stubs to
> work, but it did make some of the tests more difficult.  Plus these
> tests are actually on the Order object, so it seemed natural to stub
> out the Receipt so I'm not trying test it as well.
>
> I don't quite follow the code that you included... are you essentially
> overriding the your Person model with your own class for the test?
>
> This is the snippet of code I'm trying to test.  I won't argue that I
> need stubs here, just that I was trying to use them and couldn't. :)
>
> class Order < ActiveRecord::Base
>   # ... deleted
>
>   # Builds a receipt and associated receipt_items,
>   # then distributes the payment across them.
>   def build_receipt(date_paid, payment_method, amount_paid_cents)
>     receipt = Receipt.new do |r|
>       r.member = member
>       r.payment_method = payment_method
>       r.date_paid = date_paid
>     end
>
>     # ... deleted
>   end
> end

I don't have a solution for you using mocks - but I wonder why you're
not just doing this:

Receipt.new(:member => member, :payment_method => payment_method,
:amount_paid_cents => amount_paid_cents)

Any reason?

>
> Thanks.
>
> -james
>
> On 4/20/07, David Chelimsky <dchelimsky at gmail.com> wrote:
> > On 4/20/07, James Hillyerd <james at hillyerd.com> wrote:
> > > Ok, I followed the advice of the list and moved more code into my
> > > model from my controller.  When developing tests for this new code, I
> > > ran into a problem...
> > >
> > > My model code creates a receipt object and sets some values on it:
> > >
> > > @receipt = Receipt.new do |r|
> > >   r.x = 1
> > >   r.y = 2
> > >   # etc
> > > end
> > >
> > > I wanted to be able to stub out Receipt.new so that I could set
> > > expectations on the methods called on the resulting Receipt object.
> > > If in my test setup I do:
> > >
> > > @receipt = mock_receipt
> > > Receipt.stub!(:new).and_return(@receipt)
> > >
> > > The block part of the code will never be called.  If I do:
> > >
> > > Receipt.stub!(:new).and_yield(@receipt)
> > >
> > > Then @receipt in my model will be set to the return value of the block.
> > >
> > > I also tried something along the lines of:
> > >
> > > Receipt.stub!(:new) do
> > >   yield @receipt
> > >   @receipt
> > > end
> > >
> > > but got some weird no block error.
> > >
> > > Help?  Am I going about this all wrong?
> >
> > Any reason you don't just query a real receipt object?
> >
> > describe Person do
> >   it "should create an initialized person" do
> >     Person.create_initialized("Michael").name.should == "Michael"
> >   end
> > end
> >
> > class Person
> >   class << self
> >     def create_initialized(name)
> >       Person.new do |p|
> >         p.name = name
> >       end
> >     end
> >   end
> > end
> >
> > What you're trying to mock here doesn't seem to buy you much. Unless
> > I'm missing something.
> >
> > >
> > > -james
> > >
> > > --
> > > James A. Hillyerd <james at hillyerd.com>
> > > Chief Technical Officer - ActiveRain Corp
> > > _______________________________________________
> > > rspec-users mailing list
> > > rspec-users at rubyforge.org
> > > http://rubyforge.org/mailman/listinfo/rspec-users
> > >
> > _______________________________________________
> > rspec-users mailing list
> > rspec-users at rubyforge.org
> > http://rubyforge.org/mailman/listinfo/rspec-users
> >
>
>
> --
> James A. Hillyerd <james at hillyerd.com>
> Chief Technical Officer - ActiveRain Corp
> _______________________________________________
> rspec-users mailing list
> rspec-users at rubyforge.org
> http://rubyforge.org/mailman/listinfo/rspec-users
>


More information about the rspec-users mailing list