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

James Hillyerd james at hillyerd.com
Fri Apr 20 19:11:04 EDT 2007


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

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


More information about the rspec-users mailing list