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

James Hillyerd james at hillyerd.com
Fri Apr 20 19:36:10 EDT 2007


Nope, no real reason... was just how I wrote the code.  Coming from
Java, I'm used to creating an object and then calling the setters, the
hashed attributes thing looks ugly to me.  :)

How exactly would I test that if I wanted to set an expectation on
:new?  Seems fragile to specify the exact Hash of attributes I'm
expecting.  Maybe ActiveRecord calls the :member= etc methods
internally?

-james

> 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
> >
> _______________________________________________
> 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