ruby-on-rails - 如何在 Rails 中使用 Rspec stub 错误引发?

标签 ruby-on-rails ruby unit-testing rspec stubbing

我是 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/

相关文章:

mysql - 在 Rails 脚手架的日期范围内显示数据

ruby-on-rails - 安装 rails 后,如何在 amazon ec2 实例上运行 rails server?

javascript - Bootstrap 表单如何绑定(bind)到 Rails 模型?

Ruby:将两个相似的方法合并为一个?

java - 出现错误“[junit] java.lang.OutOfMemoryError : PermGen space

ruby-on-rails - Rails 加载路径问题

ruby-on-rails - 获取嵌套哈希的键/值对

ruby-on-rails - Rails 控制台执行代码的陈旧副本

c++ - Catch 单元测试订购

javascript - 如何用 Jest 来模拟模块的某些部分?