Ruby on rails Rspec:未定义的方法'all';

Ruby on rails Rspec:未定义的方法'all';,ruby-on-rails,rspec,pagination,Ruby On Rails,Rspec,Pagination,我必须在控制器中测试分页方法 在我的控制器中 @categories = Category.paginate(:page => params[:page], :per_page => params[:per_page]).all(:order => 'id ASC') 按照我的要求 Category.should_receive(:paginate) get :user_category, { :per_page => 1, :page => 1 } 在我的日志

我必须在控制器中测试分页方法

在我的控制器中

@categories = Category.paginate(:page => params[:page], :per_page => params[:per_page]).all(:order => 'id ASC')
按照我的要求

Category.should_receive(:paginate)
get :user_category, { :per_page => 1, :page => 1 }
在我的日志中显示

NoMethodError:
   undefined method `all' for nil:NilClass
如何通过此测试?

您的测试应该是:

Category.should_receive(:paginate)
get :user_category, :per_page => 1, :page => 1

为了获得参数[:每页]

我假设您使用的是
将分页
gem

paginate助手对您的数据库执行ActiveRecord查询,在您的例子中是测试环境数据库

您得到的错误意味着分页查询未返回任何对象

这可能是因为您的测试应该是

Category.should_receive(:paginate)
get :user_category, :per_page => 1, :page => 1
为了正确设置
:per_page
参数


另外,请确保测试数据库工作正常,并且其中确实包含一些类别。

单独而言,
应该接收将存根接收器,并导致方法返回
nil

但是,您可以指定返回值:

Category.should_receive(:paginate).and_return(categories_mock)
在RSpec的更高版本中,您还可以将其设置为静止:

更新:

顺便说一下,带有参数的
all()
调用是。您可以这样编写代码:

@categories = Category.paginate(:page => params[:page], :per_page => params[:per_page]).order('id ASC')
我个人更喜欢将分页链接到最后,因为它与表示相关

对于存根,您可以使用:


请注意,如果您集成视图,此存根可能会导致问题,因为分页辅助程序需要的是分页对象而不是数组。

是的,我使用的是will_paginate gem,而且我的testdb工作正常,参数也在传递。我仍然无法做到。我们可以看到您传递的返回值吗?另外,如果您不介意在测试中不删除分页,请尝试
并调用\u original()
让(:categories){[mock\u model(Category)]}
Category.应该接收(:paginate)。并且返回(categories)
您不再获得此选项是否正确:
未定义的方法“all”对于nil:NilClass
,但对于数组是否存在类似的异常?请查看答案更新。是的,我对[#]:Array
未定义的方法“all”很感兴趣。更新后的答案将使测试通过。但是,当控制器中不包含分页方法时,它会显示错误吗?@SanthNish,如果更改顺序或省略方法链中的某些方法,则必须相应地调整存根。关于错误,如果您在视图规范或请求规范中执行这种类型的存根操作(任何实际调用分页帮助程序的操作),您很可能会遇到错误。例如,数组对象没有
total\u count
方法。
@categories = Category.paginate(:page => params[:page], :per_page => params[:per_page]).order('id ASC')
categories_mock = [mock_model(Category)]
Category.stub_chain(:paginate, :order).and_return(categories_mock)