[rspec-users] mocking methods in the controller.

David Chelimsky dchelimsky at gmail.com
Fri Jul 6 08:59:28 EDT 2007


On 7/6/07, Daniel N <has.sox at gmail.com> wrote:
> On 7/6/07, Daniel N <has.sox at gmail.com> wrote:
> > On 7/6/07, David Chelimsky < dchelimsky at gmail.com> wrote:
> > > On 7/5/07, Daniel N <has.sox at gmail.com> wrote:
> > > > Hi,
> > > >
> > > > I'm very new to rspec so please be patient with me.
> > > >
> > > > I've tried to take some of my tests out of the controller specs to
> check for
> > > > things that are rendered.
> > > >
> > > > This has not worked so well, since my views have the controller method
> > > >
> > > > current_user
> > > >
> > > > in quite a few places.
> > > >
> > > > Is there any way that I can define this so that my views will be
> executed?
> > > > Will this same thing occur for all helper methods that are definied in
> the
> > > > controller?
> > >
> > > If I understand you correctly, you are trying to take tests for views
> > > that were previously rails functional tests and turn them into rspec
> > > view examples. If that is the case, you should be able to do this:
> > >
> > >
> template.stub!(:current_user).and_return(mock_model(User))
> > >
> > > If not, please provide an explicit example so we can better understand
> > > what you're talking about.
> > >
> > > Cheers,
> > > David
> >
> >
> >
> > Thanx David,
> >
> > That looks like what I was looking for.
> >
> > I will try it when I get home.
> >
> > Cheers
> > Daniel
>
> Ok I've started to have a crack at this but it's getting way out of hand.
> Everytime I stub a method there's another one to do.
>
> I've also found that when there's a partial _detail and I've passed the
> :collection => @things to it it blows up complaining that the local variable
> is nil in
> dom_id( detail )

If you're using the trunk, you can do this:

template.expects_render(:partial => 'detail', :collection => @things)

>
> Am I doing someting wrong?  The start of my specs is
>
>   before do
>     @u = mock_model( User )
>     @book = mock_model( Book )
>
>     public_book = mock_model( Book )
>     private_book = mock_model( Book )
>     public_book.stub!(:title=).and_return( "Public Title" )
>     private_book.stub!(:title=).and_return( "Private Title"
> )
>     public_book.stub!( :title ).and_return( "Public Title" )
>     private_book.stub!( :title ).and_return( "Private Title" )

Why are you stubbing the same calls twice each?

>
>     @u.stub!( :public_books ).and_return( [public_book] )
>     @u.stub!( :private_books ).and_return( [private_book] )
>     @clip = mock_model( Clip )
>     @clip.stub!( :id ).and_return( 1 )
>     @clips = [ @clip ]
>
>     template.stub!( :current_user ).and_return( @u )
>   end
>
> and I've only started.  Is it normal to have to stub this much for a view?

Depends on how much stuff is in your view :)

You've got a couple of options. You could create instances of the
model instead. As long as you're not saving and retrieving them
there's very little db interaction - just enough for AR to discover
the attributes.

If you prefer to keep it all mocked/stubbed, you could clean up a bit like this:

before do
  @u = mock_model( User )
  @book = mock_model( Book )

  public_book = mock_model(Book, :title => 'Public Title')
  private_book = mock_model( Book, :title => 'Private Title')

  @u.stub!( :public_books ).and_return( [public_book] )
  @u.stub!( :private_books ).and_return( [private_book] )

  @clips = [ @clip = mock_model( Clip, :id => 1 ) ]

  template.stub!( :current_user ).and_return( @u )
end

That stubs the same amount of stuff, but its a little cleaner. You
could also write a shared behaviour that stubs current user:

describe "authenticated page view", :shared => true do
  before(:each) do
    template.stub!( :current_user ).and_return( @u )
  end
end

describe "/some/page"
  it_should_behave_like "authenticated page view"

  before(:each) do
    @u = mock_model( User )
    @book = mock_model( Book )

    public_book = mock_model(Book, :title => 'Public Title')
    private_book = mock_model( Book, :title => 'Private Title')

    @u.stub!( :public_books ).and_return( [public_book] )
    @u.stub!( :private_books ).and_return( [private_book] )

    @clips = [ @clip = mock_model( Clip, :id => 1 ) ]

  end
end

There's probably a bit more to clean up but I'd have to see the view
code. Would you mind letting us see it?

>
> Cheers
> Daniel
>
>
>
> _______________________________________________
> rspec-users mailing list
> rspec-users at rubyforge.org
> http://rubyforge.org/mailman/listinfo/rspec-users
>


More information about the rspec-users mailing list