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

Guru Cifani lol

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:

https://github.com/rspec/rspec-mocks/blob/master/README.md

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

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: ‘random@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.

Anyone?

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