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

James Hillyerd james at hillyerd.com
Fri Apr 20 19:28:47 EDT 2007


Found this in the AR source:

      # New objects can be instantiated as either empty (pass no
construction parameter) or pre-set with
      # attributes but not yet saved (pass a hash with key names
matching the associated table column names).
      # In both instances, valid attribute keys are determined by the
column names of the associated table --
      # hence you can't have attributes that aren't part of the table columns.
      def initialize(attributes = nil)
        @attributes = attributes_from_column_definition
        @new_record = true
        ensure_proper_type
        self.attributes = attributes unless attributes.nil?
        yield self if block_given?
      end


-james

On 4/20/07, David Chelimsky <dchelimsky at gmail.com> wrote:
> 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
> > >
> >
> _______________________________________________
> 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