RailsTutorial Ch. 10:如何测试只有激活的用户才能被其他人看到?

RailsTutorial Ch. 10: How do I test that only activated users are viewable to others?

目前,我的 Rails 应用仅在搜索结果中显示激活的用户帐户。如果该配置文件已被激活,它也只允许人们导航到配置文件页面。要完成这些事情,users_controller.rb 配置如下:

def index
  @users = User.where(activated: true).paginate(page: params[:page])
end

def show
  @user = User.find(params[:id])
  redirect_to root_url and return unless @user.activated?
end

我想知道如何使用集成测试来检查此行为。我目前的测试是这样的:

test "only show profiles of activated users" do
  log_in_as(@admin)
  get users_path
  assert_template 'users/index'
  assert_select 'div.pagination'
  first_page_of_users = User.paginate(page: 1)
  first_page_of_users.each do |user|
    assert_equal true, user.activated?
  end
end

我还修改了 /fixtures/users.yml 以包含尚未激活其个人资料的用户:

non:
  name: Non Activated
  email: nonactivated@example.gov
  password_digest: <%= User.digest('password') %>
  activated: false

当我 运行 rake test 时,我得到这个错误:

FAIL["test_only_show_profiles_of_activated_users", UsersIndexTest, 1.271917]
test_only_show_profiles_of_activated_users#UsersIndexTest (1.27s)
    Expected: true
    Actual: false
test/integration/users_index_test.rb:40:in `block (2 levels) in <class:UsersIndexTest>'
test/integration/users_index_test.rb:39:in `block in <class:UsersIndexTest>'

任何人都可以帮助我理解为什么该测试能够检测到未激活用户的配置文件吗?

我认为您可以使用更好的访问方式 default scope

default_scope where(:published => true)

首先,让我声明一下,我在同样的练习中遇到的困难让我来到了这里,所以我很感谢你 post。晚了 6 个月,但也许我的回复可以提供一些见解。

经过一番努力,我清楚了这一点:

  1. User.paginate 对 users_controller.rb 中的实际代码是半冗余的,此外,实际上会导致您的直接问题——也就是说,在您的测试中,User.paginate 不会包括 where 过滤器
  2. 直接在测试中实例化 User.paginate 并使用它来评估自己的成员没有意义 - 在这种情况下,测试仅测试自身而不是应用程序
  3. 为了实际测试应用程序,必须访问 users_controller.rb 中的 @users 实例变量,例如 my_test_users = assigns(:users)
  4. 为了彻底测试 users.yml 夹具中预定义的未激活用户的存在,我们应该检查 all页,这就提出了如何确定总页数的问题——will_paginate提供了这个:my_test_users.total_pages
  5. 有助于此练习的最终见解是真正开始理解构成 REST-ful 实现的内容,即控制器操作映射如何与命名路由和参数化一起工作,例如,get users_path, page: 1 --这显然调用了用户控制器,如果我们记得 will_paginate 接受一个 :page 参数 --> User.paginate(page: params[:page]) -- 我们看到这个参数是由上面的命名路径参数提供的

所以希望这些足以将各个部分组合在一起以进行完整的集成测试。

(查看未激活用户是否在尝试导航到用户个人资料时被重定向到 root_url 的测试要简单得多)

就其价值而言,到目前为止,这个练习已被证明是本教程中最具挑战性和最有价值的练习。