【问题标题】:undefined method total_pages' for array will_paginate rspec数组 will_paginate rspec 的未定义方法 total_pages'
【发布时间】:2015-02-06 15:17:25
【问题描述】:

我已将 gem 'will_paginate' 和 gem 'will_paginate-bootstrap' 添加到我的应用程序中,并且运行良好。但是,由于 RSpec 测试,我确实收到了此错误消息。

Failure/Error: render
     ActionView::Template::Error:
       undefined method `total_pages' for #<User::ActiveRecord_Relation:0x007f8c238a97b8>

这是 Rspec 代码:

 it "renders a list of users" do
    render

    page = Capybara::Node::Simple.new(rendered)

    expect(page).to have_content("Smith, Agent admin@somewhere.com Site Admin")
    expect(page).to have_content("Johnson, Bob manager.email@elsewhere.com The Company Name")
  end

users_controller.rb

def index
    @per_page = params[:per_page] || 10
    @users = User.paginate(:page => params[:page], :per_page => @per_page).order('last_name  ASC')
end

index.html.erb

<div class="pull-right">
  Records per page
  <%= select_tag :per_page, options_for_select([10,25,50,100], params[:per_page].to_i),
       :onchange => "if(this.value){window.location='?per_page='+this.value;}" %>
</div>

<%= page_entries_info @users %>

<br>
<div class="pull-right">
  <%= will_paginate @users, renderer: BootstrapPagination::Rails %>
</div>

【问题讨论】:

  • 我不认为这是问题所在,但是为什么您在索引操作中定义了两次@users?
  • 嗨,麦克斯,我现在真的太过分了。 :) 谢谢!

标签: ruby-on-rails ruby ruby-on-rails-4 rspec


【解决方案1】:

如果您使用的是 Rspec >= 3,请尝试以下操作:

 it "renders a list of users" do
    allow(view).to receive_messages(:will_paginate => nil) # Add this

    render

    page = Capybara::Node::Simple.new(rendered)

    expect(page).to have_content("Smith, Agent admin@somewhere.com Site Admin")
    expect(page).to have_content("Johnson, Bob manager.email@elsewhere.com The Company Name")
  end

【讨论】:

  • 基于这个答案,我使用了view.stub :will_paginate,它适用于 Rspec 2.14。
  • 我的视图规范得到了undefined method 'total_pages' for #&lt;Array...,但以上解决了我的问题。谢谢!
【解决方案2】:

使用 Kaminari 助手


RSpec.describe 'rendering view', type: :view do

  let(:posts) do
    Kaminari.paginate_array(create_list(:post, 10)).page(1)
  end

  it 'displays posts' do
    # assign(:posts, posts) # if it's instance variable
    render partial: '/post_list.html.erb', :locals => {:posts => posts }
  end

end

【讨论】:

    猜你喜欢
    • 2010-11-27
    • 2011-09-15
    • 1970-01-01
    • 2016-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多