练习说明: 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)的示例应用程序的参考实现,但不幸的是他没有提供与练习相关的任何代码。
感谢您的帮助!
答案 0 :(得分:0)
在第10.1章中,对于更新测试,我们在用户控制器上允许使用空密码进行测试:
class User < ApplicationRecord
.
.
has_secure_password
validates :password, presence: true, length: { minimum: 6 }, allow_nil: true
.
.
end
如同一章所述,已使用has_secure_password帮助程序保护了密码以供联机使用。 希望我能帮忙