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

我如何使这个测试通过?

4

3 回答 3

2

就其本身而言,should_receive将存根接收器并导致方法返回nil

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

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

在 RSpec 的更高版本中,您还可以将其设置为仍然调用并使用原始方法的返回值

Category.should_receive(:paginate).and_call_original

更新:

顺便说一句,不再支持all()带参数的调用。你可以这样写代码:

@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)

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

于 2013-09-26T08:12:39.307 回答
1

你的测试应该是:

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

为了有 params[:per_page]

于 2013-09-26T07:55:45.497 回答
0

我假设您正在使用will_paginate宝石。

分页助手对您的数据库执行 ActiveRecord 查询,在您的情况下是您的测试环境数据库。

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

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

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

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

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

于 2013-09-26T08:01:24.607 回答