Rspec 在应用程序工作时"<ActiveRecord>.nil? or <ActiveRecord>.field.empty?"失败



使用Rspec开始TDD之旅,但遇到了一些问题。无法理解为什么我的rspec在。。。OR条件。

  def director
    @movie = Movie.find_by_id(params[:id])
    if @movie.nil? or @movie.director.empty?
      flash[:notice] = "The movie has no director info"
      redirect_to movies_path
    else
      # success
    end
  end  

Rspec测试:

before ... #stubs
it 'assigns movies array in director action' do
    Movie.stub(:find_by_id).and_return(@movie)
    get "director", :id => 1
    ... 
end

错误:

  1) MoviesController assigns movies array in director action
     Failure/Error: get "director", :id => 1
     NoMethodError:
       You have a nil object when you didn't expect it!
       You might have expected an instance of Array.
       The error occurred while evaluating nil.empty?

如果没有找到记录,那么@movie.nil?是否应满足条件和@movie.director.empty?不应根据;这是正确的吗?

在这种情况下,我不在乎是否没有这样的记录,或者请求记录的director字段是空的,我也以同样的方式处理它。

感谢你的帮助。


更新

我已经删除了一些控制器的东西到这样的模型:

控制器:

  def director
    @movies = Movie.same_director_by_id(params[:id])
    if @movies.blank?
      redirect_to movies_path
    end
  end

电影:

  def self.same_director_by_id (id)
    movie = self.find_by_id(id)
    if movie.nil? or movie.director.blank?
      return []
    else
      return self.where("id != ?", id).find_all_by_director(movie.director)
    end
  end

rsspec:

it 'assigns movies array in director action' do
    Movie.should_receive(:same_director_by_id).and_return([@movie])
    get "director", :id => 1
    assigns(:movies).should be_kind_of(Array)
end

现在所有的控制器规格都通过了。我将单独测试模型。

更新2:

问题是我把它搞砸了:导演在模特身上,而不是在模拟身上!摇头是正确的。

如注释中所述,必须对每个对象/方法进行mock/stub。此处缺少directory

最新更新