Rspec:未定义的方法`all'

时间:2013-09-26 07:37:58

标签: ruby-on-rails rspec pagination

我必须在控制器中测试paginate方法。

在我的控制器中

@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

如何让这个测试通过?

3 个答案:

答案 0 :(得分:2)

单独should_receive将存根接收器并使该方法返回nil

但您可以指定返回值:

Category.should_receive(:paginate).and_return(categories_mock)

在RSpec的更高版本中,您还可以将其设置为静止call and use the return value of the original method

Category.should_receive(:paginate).and_call_original

<强>更新

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

@categories = Category.paginate(:page => params[:page], :per_page => params[:per_page]).order('id ASC')

我个人更喜欢将分页链接到最后,因为它与演示文稿相关。

对于存根,您可以使用stub_chain()

categories_mock = [mock_model(Category)]
Category.stub_chain(:paginate, :order).and_return(categories_mock)

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

答案 1 :(得分:1)

您的测试应该是:

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

为了有params [:per_page]

答案 2 :(得分:0)

我假设您正在使用will_paginate gem。

paginate helper对您的数据库执行ActiveRecord查询,对您的测试环境数据库执行。

您获得的错误意味着您的分页查询没有返回任何对象。

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

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

为了正确设置您的:per_page参数。

另外,请确保您的测试数据库工作正常,并且您实际上有一些类别。