【问题标题】:Rspec: undefined method `all'Rspec:未定义的方法“全部”
【发布时间】:2013-09-26 18:20:02
【问题描述】:

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

在我的控制器中

@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

我如何让这个测试通过?

【问题讨论】:

    标签: ruby-on-rails rspec pagination


    【解决方案1】:

    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)
    

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

    【讨论】:

    • 我们可以看看你传递的返回值吗?另外,如果您不介意在测试中删除分页,请尝试and_call_original()
    • let(:categories) { [mock_model(Category)] } Category.should_receive(:paginate).and_return(categories)
    • 您不再得到这个是否正确:undefined method "all" for nil:NilClass 但数组有类似的异常?请查看答案更新。
    • 是的,我越来越喜欢undefined method 'all' for [#<Category:0x3fc198c1142c @name="Category_1001">]:Array..您更新的答案将使测试通过..但是当控制器中不包含分页方法时它会显示错误吗?
    • @SanthNish,如果您更改顺序或省略方法链中的某些内容,则必须相应地调整存根。关于错误,如果您在视图规范或请求规范中执行这种存根操作——任何实际上会调用分页助手的东西——您很可能会遇到错误。例如,数组对象没有total_count 方法。
    【解决方案2】:

    你的测试应该是:

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

    为了有参数[:per_page]

    【讨论】:

      【解决方案3】:

      我假设您正在使用 will_paginate gem。

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

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

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

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

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

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

      【讨论】:

      • 是的,我正在使用 will_paginate gem,我的 testdb 也可以正常工作,参数也通过了..我还是做不到..
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多