我是 Rails 和 Rspec 的新手,我正在使用 Rspec 来测试这个包含异常处理的 Controller 方法:
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
这解决了我的问题并且测试通过了。
最佳答案
你非常接近。您需要在其中添加 any_instance
。
Movie.any_instance.stub(:find_movies_director).and_raise(Movie::NoDirectorError)
编辑:我误读了帖子。以上内容适用于 Movie 的实例,但不适用于 OP 的问题。
关于ruby-on-rails - 如何在 Rails 中使用 Rspec stub 错误引发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14942828/