我正在为用户登录编写黄瓜测试。
我有这样的场景背景,将用户添加到数据库
User.create!(
:email => email,
:password => password,
:password_confirmation => password
)
那么,为什么在我的顺序步骤中,我得到@ user.password nil?
@user = User.find_by :email => "some@email.com"
...
fill_in('Email', :with => @user.email)
fill_in('Password', :with => @user.password)
...
答案 0 :(得分:6)
Devise最初通过加密来存储原始密码。 encrypted_password
(模型中的字段名称)存储在数据库中。
现在,当您致电User.find_by :email => "some@email.com"
时,password
字段不存在。password
不是模型用户中的字段。它是模型中存在的实例变量,仅在您提交login/sign up
表单时设置。在您的情况下,您尝试在log in
之前访问密码字段,因此,未设置实例变量,并且您将password
设为nil。
如果您需要更多详细信息,可以查看Devise password
的实际实施情况答案 1 :(得分:1)
查看devise cucumber test维基页面了解更多信息。
正如Kirti指出的那样,您无法在用户模型中访问密码作为属性,特别是不能以纯文本形式访问。
如果您正在测试登录,请将密码字段保留为变量,或者在该测试中创建用户。
Given /^I am a new, authenticated user$/ do
email = 'testing@man.net'
password = 'secretpass'
User.create!(
:email => email,
:password => password,
:password_confirmation => password
)
visit '/users/sign_in'
fill_in "user_email", :with => email
fill_in "user_password", :with => password
click_button "Sign in"
end
如果您确实需要稍后查找用户(@user = User.find_by
)并填写密码,那么您需要将密码作为变量保留在测试范围之外。