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

David Chelimsky dchelimsky at gmail.com
Fri Apr 20 20:16:33 EDT 2007


On 4/20/07, James Hillyerd <james at hillyerd.com> wrote:
> 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?

That's how I do this sort of thing:

Model.should_receive(:new).with(:a => "b", :c => "d")

Model.new(:a => "b", :c => "d")

Works fine if *your* code calls .new.

Cheers,
David

>
> -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
> _______________________________________________
> rspec-users mailing list
> rspec-users at rubyforge.org
> http://rubyforge.org/mailman/listinfo/rspec-users
>


More information about the rspec-users mailing list