How to stub error raising using Rspec in Rails?

Marina K picture Marina K · Feb 18, 2013 · Viewed 23.5k times · Source

I'm new to Rails and Rspec and I'm using Rspec to test this controller method which includes exception handling:

def search_movies_director
  @current_movie = Movie.find(params[:id])
  begin
    @movies = Movie.find_movies_director(params[:id])
  rescue Movie::NoDirectorError
    flash[:warning] = "#{@current_movie} has no director info"
    redirect_to movies_path
  end
end

I can't figure out how to correctly test the said path: after invalid search (when error is received) it should redirect to the homepage. I tried something like this:

describe MoviesController do
  describe 'Finding Movies With Same Director' do
    #some other code

    context 'after invalid search' do
      it 'should redirect to the homepage' do
        Movie.stub(:find)
        Movie.stub(:find_movies_director).and_raise(Movie::NoDirectorError)
        get :search_movies_director, {:id => '1'}
        response.should redirect_to movies_path
      end
    end

  end
end

After running the test fails with an error: NameError: uninitialized constant Movie::NoDirectorError

How to fake raising an error in this test so it actually checks whether redirect happens?

Thanks!

UPDATE:

As nzifnab explained, it couldn't locate Movie::NoDirectorError. I forgot to define this exception class. So I added it to app/models/movie.rb :

class Movie < ActiveRecord::Base
  class Movie::NoDirectorError < StandardError ; end
  #some model methods
end

This solved my problem and this test passes.

Answer

Philip Hallstrom picture Philip Hallstrom · Feb 18, 2013

You're very close. You need to add any_instance in there.

Movie.any_instance.stub(:find_movies_director).and_raise(Movie::NoDirectorError)

edit: I misread the post. The above would work given an instance of Movie, but not for OP's question.