2013-02-18 73 views
14

我是新来的Rails和RSpec和我使用Rspec的测试这个控制器的方法,包括异常处理:如何在Rails中使用Rspec提升错误提升?

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 

我无法弄清楚如何正确测试说路径:无效的搜索后, (当收到错误时)它应该重定向到主页。我想是这样的:

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 

运行测试后因错误而失败:NameError: uninitialized constant Movie::NoDirectorError

如何假扮在本次测试引发错误,因此实际检查重定向是否会发生?

谢谢!

UPDATE:

由于nzifnab解释说,它无法找到Movie::NoDirectorError。我忘了定义这个异常类。所以我把它添加到app/models/movie.rb

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

这解决了我的问题,这个测试通过。

回答

11

该错误表明它不知道定义异常类的位置。您可能需要专门require定义该类的文件,或者测试可能无法找到它。

Rails将自动尝试使用常规文件目录格式定位任何constant missing常量。它将根据常量的名称在load_pathmovie/no_director_errormovie中查找文件。如果没有找到该文件,或者该文件没有定义预期的常量,则需要自己专门要求该文件。

+0

你说得对,'Movie :: NoDirectorError'没有被定义在任何地方。我在'app/models/movie.rb'中定义了这个异常类,现在我的测试通过了。谢谢! – 2013-02-18 19:58:45

18

你非常接近。您需要在那里添加any_instance

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

编辑:我误读了帖子。以上将给出一个电影的实例,但不适用于OP的问题。

+1

这不是他的使用实例方法,它是一个类的方法。他说得对。 – nzifnab 2013-02-18 18:40:16

+0

只需添加any_instance并不适用于我,仍然会出现相同的错误。 – 2013-02-18 18:59:55

+0

Doh。你是对的。我误解了一些东西。不理我。 – 2013-02-18 20:46:58

0

在Rails 4.1:

verse_selector = double("VerseSelector", select_verses: ActiveRecord::RecordNotFound.new("Verses not found"))

verse_selector.select_verses现在会返回一个ActiveRecord::RecordNotFound