[rspec-users] Mocking and stubbing model relationships

Chris Flipse cflipse at gmail.com
Wed Nov 19 12:26:14 EST 2008


I've actually taken this old gem and enhanced it a bit

module Spec::Mocks::Methods
  def stub_association!(association_name, methods_to_be_stubbed ={})
    mock_assn = Spec::Mocks::Mock.new(association_name.to_s)
    stub_association_with(association_name, mock_assn,
methods_to_be_stubbed)
  end

  def stub_association_with(association_name, values, methods_to_be_stubbed
= {})
    methods_to_be_stubbed.each do |meth, return_value|
        values.stub!(meth).and_return(return_value)
    end
    yield(values) if block_given?

    self.stub!(association_name).and_return(values)
  end
end

This lets me specify the "contents" of an association:

foo.stub_association_with(:bar, [@bar1, @bar2, @bar3], :find => @bar1)

and also gives me some more fine grained control about stubbing the
association

foo.stub_association_with(:bar, [@bar1, @bar2, @bar3]) do |assn|
  assn.stub!(:find).with(1).and_return @bar1
  assn.stub!(:find).with(2).and_return @bar2
  assn.stub!(:find).with(5).and_raise RecordNotFound
end



On Tue, Nov 18, 2008 at 3:49 PM, Ben Mabey <ben at benmabey.com> wrote:

> I like to place this in my spec_helper.rb:
>
> module Spec
>  module Mocks
>   module Methods
>     def stub_association!(association_name, methods_to_be_stubbed = {})
>       mock_association = Spec::Mocks::Mock.new("#{association_name}
> association")
>       methods_to_be_stubbed.each do |method, return_value|
>         mock_association.stub!(method).and_return(return_value)
>       end
>       self.stub!(association_name).and_return(mock_association)
>       mock_association
>     end
>   end
>  end
> end
>
>
>
> The you can say stuff like:
>
> @user.stub_association!(:properties, :new => mock_model(Property),
> :find_by_id => mock_model(Property))
>
> HTH,
> Ben
>
>
> _______________________________________________
> rspec-users mailing list
> rspec-users at rubyforge.org
> http://rubyforge.org/mailman/listinfo/rspec-users
>



-- 
// anything worth taking seriously is worth making fun of
// http://blog.devcaffeine.com/
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://rubyforge.org/pipermail/rspec-users/attachments/20081119/15ac8678/attachment.html>


More information about the rspec-users mailing list