我必须在控制器中测试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
如何让这个测试通过?
答案 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
参数。
另外,请确保您的测试数据库工作正常,并且您实际上有一些类别。