Rails教程用户测试失败求助:分页元素div.pagination未找到
嘿,别担心,新手遇到测试问题太正常了!我来帮你一步步排查这两个分页相关的测试失败问题~
你遇到的两个错误
UsersIndexTest#test_index_as_admin_including_pagination_and_delete_links:期望至少1个匹配div.pagination的元素,实际找到0个UsersProfileTest#test_profile_display:期望至少1个匹配div.pagination的元素,实际找到0个
第一个问题:个人页面(Profile)测试失败
你的show.html.erb里确实写了<%= will_paginate @microposts %>,但测试没找到分页组件,核心原因是测试用的用户没有足够多的micropost触发分页。
Rails的will_paginate默认只有当记录数超过每页显示数(默认是30条)时,才会渲染分页容器。如果你的测试用户只有几条micropost,分页组件根本不会出现,自然过不了assert_select 'div.pagination'这一关。
解决方法
在user_profile_test.rb的测试方法里,给测试用户创建至少31条micropost:
test "profile display" do # 先创建足够多的micropost触发分页 31.times { @user.microposts.create!(content: "随便写点测试内容就行") } get user_path(@user) assert_template 'users/show' assert_select 'title', full_title(@user.name) assert_select 'h1', text: @user.name assert_select 'h1>img.gravatar' assert_match @user.microposts.count.to_s, response.body assert_select 'div.pagination' @user.microposts.paginate(page: 1).each do |micropost| assert_match micropost.content, response.body end end
第二个问题:用户列表(Index)测试失败
这个测试检查的是用户列表的分页,问题大概率出在用户列表的视图或控制器逻辑上(你没贴users/index.html.erb和users_controller.rb的代码,我按教程常规情况分析)。
需要检查的点:
控制器里是否用了分页获取用户
打开app/controllers/users_controller.rb,确认index动作里是用paginate获取用户:def index @users = User.paginate(page: params[:page]) end如果直接用
User.all,没有分页逻辑,自然不会有分页组件。用户列表视图是否添加了分页组件
打开app/views/users/index.html.erb,确认里面有will_paginate调用:<%= will_paginate %>通常放在用户列表的上方或下方。
测试数据的用户数量是否足够
和个人页面的问题一样,测试里的用户总数要超过30个才能触发分页。你可以在测试的setup方法里创建足够多的测试用户:setup do @admin = User.create!(name: "Admin", email: "admin@example.com", password: "password", admin: true) @non_admin = User.create!(name: "NonAdmin", email: "nonadmin@example.com", password: "password") # 创建30个额外用户,让总数达到32个,触发分页 30.times { |n| User.create!(name: "User #{n}", email: "user#{n}@example.com", password: "password") } end
通用检查项
最后确认一下will_paginate gem是否正确安装:
- 检查
Gemfile里是否有gem 'will_paginate' - 如果刚添加,记得运行
bundle install
内容的提问来源于stack exchange,提问作者Chidozie Nnachor

