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

David Chelimsky dchelimsky at gmail.com
Fri Apr 20 18:56:34 EDT 2007


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.

I just tried this:

irb(main):001:0> class Receipt
irb(main):002:1> attr_accessor :name
irb(main):003:1> end
=> nil
irb(main):004:0> r = Receipt.new do |r|
irb(main):005:1* r.name = "Ruby"
irb(main):006:1> end
=> #<Receipt:0x82d98>
irb(main):007:0> r.name
=> nil

Does AR do something special w/ Model.new that Ruby doesn't do already?


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


More information about the rspec-users mailing list