RailsTutorial Ch。 10:如何测试只有激活的用户可以被其他人查看?

时间:2015-06-15 22:22:10

标签: ruby-on-rails railstutorial.org

目前,我的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>'

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

2 个答案:

答案 0 :(得分:0)

我认为对于您的情况,更好的访问方式可以使用default scope

default_scope where(:published => true)

答案 1 :(得分:0)

首先,请允许我说我在同一次演习中的斗争让我来到这里,所以我不得不接受你的职位。迟了6个月,但也许我的回答可能仍会提供一些见解。

经过大量的努力,我很清楚这一点:

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

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

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

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