Help with functional test

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.

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 S. [email protected]

here’, location: ‘Anywhere’ }
end
end
Finished in 0.77996 seconds

def create

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 [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en.


thiagocifani

twitter.com/thiagocifani
del.icio.us/thiagocifani
http://del.icio.us/thiagocifani

Guru Cifani lol

2012/5/23 thiagocifani [email protected]

here’, location: ‘Anywhere’ }
end
end
Finished in 0.77996 seconds

def create

To view this discussion on the web visit

To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en.


att,

Rogerio

A complicao se descomplica na mesma proporo que fazemos os ns se
desatarem ao tecer o conhecimento do saber.

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:

http://rubydoc.info/gems/rspec-mocks/frames

Anyone?

Em quarta-feira, 23 de maio de 2012 14h51min38s UTC-3, Kleber S.
escreveu:

Have you tried with the double/stub nomenclature as I suggested?

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: '[email protected]')
      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.

Em quinta-feira, 24 de maio de 2012 22h33min46s UTC-3, Tyler escreveu: