目前,我的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>'
任何人都可以帮助我理解为什么测试能够检测未激活用户的配置文件吗?
答案 0 :(得分:0)
我认为对于您的情况,更好的访问方式可以使用default scope
default_scope where(:published => true)
答案 1 :(得分:0)
首先,请允许我说我在同一次演习中的斗争让我来到这里,所以我不得不接受你的职位。迟了6个月,但也许我的回答可能仍会提供一些见解。
经过大量的努力,我很清楚这一点:
User.paginate
对于users_controller.rb中的实际代码来说是半冗余的,而且实际上是导致您的直接问题 - 即,在您的测试中,User.paginate
不包含其中过滤器User.paginate
并使用它来评估自己的成员没有意义 - 在这种情况下,测试只测试自己而不是应用程序@users
实例变量,例如my_test_users = assigns(:users)
my_test_users.total_pages
get users_path, page: 1
- 这显然调用用户控制器,如果我们记得will_paginate采用:page参数 - &gt; User.paginate(page: params[:page])
- 我们看到此参数由上面的命名路径参数所以希望这足以将各个部分放在一起进行完整的集成测试。
(在尝试导航到用户个人资料时,未激活的用户是否被重定向到root_url的测试要简单得多)
至于它的价值,到目前为止,这个练习已被证明是本教程中最具挑战性和最有价值的。