Railstutorial |第10章|练习10.4.1.2 |为什么密码设置有效?

时间:2016-09-08 09:25:59

标签: ruby-on-rails ruby railstutorial.org ruby-on-rails-5

练习说明: Railstutorial Exercise 10.4.1.2

练习: ' FILL_IN' 必须替换为正确的代码,以便测试正常进行

test "should not allow the admin attribute to be edited via the web" do
  log_in_as(@other_user)
  assert_not @other_user.admin?
  patch user_path(@other_user), params: {
                                  user: { password:              FILL_IN,
                                          password_confirmation: FILL_IN,
                                          admin: FILL_IN} }
  assert_not @other_user.FILL_IN.admin?
end

我的解决方案:

test "should not allow the admin attribute to be edited via the web" do
  log_in_as(@other_user)
  assert_not @other_user.admin?
  patch user_path(@other_user), params: {
                                  user: { password:              'password',
                                          password_confirmation: 'password',
                                          admin: true } }
  assert_not @other_user.reload.admin?
end

我的问题:

如果您设置了':admin'属性为user_params中的允许参数列表(在UsersController类中),测试变为' Red'因为它应该。我不明白的是,你可以设置随机密码,测试仍然正常,如下:

test "should not allow the admin attribute to be edited via the web" do
  log_in_as(@other_user)
  assert_not @other_user.admin?
  patch user_path(@other_user), params: {
                                  user: { password:              'foobar',
                                          password_confirmation: 'foobar',
                                          admin: true } }
  assert_not @other_user.reload.admin?
end

唯一有效的选择不应该是'密码' (而不是' foobar'或者甚至'(即空白)),因为实例变量@other_user包含用户'射手'的值。来自fixtures文件' users.yml',谁拥有'密码'作为password_digest?这不会导致两个属性password_digest(='密码')和密码(=' foobar')之间的不匹配?或者是' password_digest'来自“射手”的属性不知怎的更新?如果是这样,它是如何工作的?

如果输入无效密码,为什么测试会变为“绿色”,例如:

test "should not allow the admin attribute to be edited via the web" do
  log_in_as(@other_user)
  assert_not @other_user.admin?
  patch user_path(@other_user), params: {
                                  user: { password:              'foo',
                                          password_confirmation: 'bar',
                                          admin: true } }
  assert_not @other_user.reload.admin?
end

可能是'补丁'请求因密码输入错误而中止,因此无法更新管理状态?这就是为什么测试是绿色' (因为管理员仍在' nil')?

我已经查看了Michael Hartl(https://bitbucket.org/railstutorial/sample_app_4th_ed)的示例应用程序的参考实现,但不幸的是他没有提供与练习相关的任何代码。

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

在第10.1章中,对于更新测试,我们在用户控制器上允许使用空密码进行测试:

class User < ApplicationRecord
.
.
has_secure_password
validates :password, presence: true, length: { minimum: 6 }, allow_nil: true 
.
.
end

如同一章所述,已使用has_secure_password帮助程序保护了密码以供联机使用。 希望我能帮忙