Help with functional test

39 views
Skip to first unread message

Kleber Shimabuku

unread,
May 23, 2012, 1:51:38 PM5/23/12
to rubyonra...@googlegroups.com
Hi guys,

I'm starting to write tests and I writing a functional test for my 'create' action.

So, basically I have the following test:

  describe '#create' do
    
    @attributes = { title: 'New post', description: 'Please add some text here', location: 'Anywhere' }

    context 'when logged in' do 
      login_user
      before { post :create, @attributes }

      it 'should create a new post' do 
        post = mock(Post, @attributes)
        assigns(:post).should_not be_nil
        Post.should_receive(:save).and_return(post)
        response.should redirect_to successful_submitted_posts_path
      end
      it 'should NOT create a new post' do 
      end
    end

    context 'when NOT logged in' do
      before { post :create, @attributes }
      it { response.should_not be_successful }
      it { response.should redirect_to new_user_session_path }
    end

  end

But it's failing and I don't get understand why.

1) PostsController#create when logged in should create a new post
     Failure/Error: post = mock(Post, @attributes)
     ArgumentError:
       wrong number of arguments (3 for 2)
     # ./spec/controllers/posts_controller_spec.rb:40:in `block (4 levels) in <top (required)>'

Finished in 0.77996 seconds
6 examples, 1 failure

why mock method expects 3 arguments? what they should be?

I have read on some blogs this kind of syntax.

mock(Object, hash)


And this is my controller:

# encoding: utf-8
class PostsController < ApplicationController
  load_and_authorize_resource
  before_filter :authenticate_user!
  respond_to :html

  def new
    @post = Post.new
  end

  def create
    @post = current_user.posts.build(params[:post])
    if @post.save
      redirect_to successful_submitted_posts_path
    else
      render :new
    end
  end

  def successful_submitted; end
end


What I'm doing wrong?

Please give me some hints.

Thank you.

thiagocifani

unread,
May 23, 2012, 10:10:13 PM5/23/12
to rubyonra...@googlegroups.com
Are u using mocha? If you are using mocha, I think you should write something like that:

mock('post', hash)


regards

2012/5/23 Kleber Shimabuku <klebers...@gmail.com>

--
You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group.
To view this discussion on the web visit https://groups.google.com/d/msg/rubyonrails-talk/-/ouy4grWHNOwJ.
To post to this group, send email to rubyonra...@googlegroups.com.
To unsubscribe from this group, send email to rubyonrails-ta...@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.



--
thiagocifani

Rogerio Medeiros

unread,
May 23, 2012, 10:56:16 PM5/23/12
to rubyonra...@googlegroups.com
Guru Cifani lol

2012/5/23 thiagocifani <cifani...@gmail.com>



--
att,

Rogerio

A complicação se descomplica na mesma proporção que fazemos os nós se desatarem ao tecer o conhecimento do saber.

Tyler

unread,
May 24, 2012, 9:33:46 PM5/24/12
to rubyonra...@googlegroups.com
I assume you are trying to mock the Post to separate it from the controller action.  You may have better luck with the double/stub nomenclature:


Kleber Shimabuku

unread,
May 25, 2012, 8:25:17 AM5/25/12
to rubyonra...@googlegroups.com
Hi,

I've changed my test a little bit so the only error I getting is the following one:

Failures:

  1) PostsController#create when logged in failure should render the NEW template
     Failure/Error: response.should render_template :new
       expecting <"new"> but rendering with <"">
     # ./spec/controllers/posts_controller_spec.rb:70:in `block (5 levels) in <top (required)>'

Finished in 1.27 seconds
7 examples, 1 failure


And the modified test:

    describe '#create' do
      
      @attributes = { post: { id: 1, title: 'New post', description: 'Please add some text here', location: 'Anywhere' } }

      context 'when logged in' do 

        before do 
          @user = FactoryGirl.create(:user, email: 'ran...@example.com')
          sign_in @user 

          @post = mock(Post, 
                      title: 'New post', 
                      description: 'Please add some text here', 
                      location: 'Anywhere')

          # expected
          controller.current_user.posts.stub!(:build).and_return(@post)
        end

        context 'success' do 
          before { @post.should_receive(:save).and_return(true) }

          it 'should create a instance variable' do 
            post :create, @attributes
            assigns(:post).title.should be_eql 'New post'
          end

          it 'should redirect to the success page' do 
            post :create, @attributes
            response.should redirect_to successful_submitted_posts_path
          end
        end

        context 'failure' do 
          before { @post.should_receive(:save).and_return(false) }

          it 'should render the NEW template' do 
            post :create, { post: { id: 1, title: 'New post', description: 'Please add some text here', location: 'Anywhere' } }
            response.should render_template :new
          end
        end
      end


I've been googling for this yesterday and it seems that I need to add somewhere an error hash, so it will render the new template instead of doing a redirect.

Kleber Shimabuku

unread,
May 27, 2012, 12:02:46 AM5/27/12
to rubyonra...@googlegroups.com
Anyone?

Tyler

unread,
May 28, 2012, 1:19:12 AM5/28/12
to rubyonra...@googlegroups.com
Have you tried with the double/stub nomenclature as I suggested?
Reply all
Reply to author
Forward
0 new messages