Ruby on rails 如何在Rails中使用Rspec来引发存根错误?

Ruby on rails 如何在Rails中使用Rspec来引发存根错误?,ruby-on-rails,ruby,unit-testing,rspec,stubbing,Ruby On Rails,Ruby,Unit Testing,Rspec,Stubbing,我是Rails和Rspec的新手,我正在使用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}

我是Rails和Rspec的新手,我正在使用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

如何在此测试中假装引发错误,以便它实际检查是否发生重定向

谢谢

更新:

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

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

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

你很接近了。您需要在其中添加
任何\u实例

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

编辑:我误读了这篇文章。如果给定一个Movie实例,上述方法将有效,但对于OP的问题则无效。

该错误表示它不知道在哪里定义了
Movie::NoDirectorError
异常类。您可能需要明确地
要求
定义该类的文件,否则测试可能无法找到它

Rails将自动尝试使用传统的文件目录格式查找任何缺少的
常量。它将根据常量的名称在
movie/no\u director\u error
movie
load\u路径中查找文件。如果找不到该文件或该文件未定义预期常数,则您需要自己明确要求该文件。

在Rails 4.1中:

verse\u selector=double(“VerseSelector”,选择\u verses:ActiveRecord::RecordNotFound.new(“verses notfound”)


verse\u选择器。select\u verses
现在将返回一个
ActiveRecord::RecordNotFound

他使用的不是实例方法,而是类方法。他是正确的。只是添加任何_实例对我都不起作用,仍然会得到相同的错误。谢谢Philip。任何_实例都是最终让我的测试工作的原因。没错,
Movie::NoDirectorError
没有在任何地方定义。我在app/models/movie.rb中定义了这个异常类,现在我的测试通过了。谢谢