Ruby on rails 如何在Rails中使用Rspec来引发存根错误?
我是Rails和Rspec的新手,我正在使用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}
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中定义了这个异常类,现在我的测试通过了。谢谢