我是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这解决了我的问题,这次考试通过了。
发布于 2013-02-18 18:37:37
错误指示它不知道在哪里定义了Movie::NoDirectorError异常类。您可能需要专门对定义该类的文件进行require,否则测试可能无法找到它。
Rails将自动尝试使用常规文件目录格式来定位任何constant missing常量。它将根据常量的名称在load_path at movie/no_director_error和movie中查找一个文件。如果找不到该文件,或者该文件未定义预期常量,则需要自己具体要求该文件。
发布于 2013-02-18 18:35:28
你们很亲密。您需要在其中添加any_instance。
Movie.any_instance.stub(:find_movies_director).and_raise(Movie::NoDirectorError)编辑:我看错了这篇文章。考虑到电影的一个例子,上面的内容将是可行的,但对于OP的问题则不起作用。
发布于 2014-07-10 12:33:53
在Rails 4.1中:
verse_selector = double("VerseSelector", select_verses: ActiveRecord::RecordNotFound.new("Verses not found"))
verse_selector.select_verses现在将返回一个ActiveRecord::RecordNotFound
https://stackoverflow.com/questions/14942828
复制相似问题