嗨,我想对使用 Devise 和 CanCan 的 Rails 3 应用程序进行一些功能测试。
在我的用户模型中,我有用户年龄,我想测试用户是否只能访问特定页面,如果他们是:
我在 Devise 文档中看到我可以使用: *sign_in* 并且我已经把它放在我的测试中并且它似乎工作 - 测试没有错误,因为我有:
include Devise::TestHelpers
在我的 *test_helper.rb*
当我取出它时,我的测试会出错,因为 *sign_in* 未定义。所以这不是一个 helper 问题。
当我运行测试并检查 span#loggedin 是否出现一次时,测试失败,因为出现了 0 次。 span#loggedin 仅出现 *if user_signed_in?*
我需要在我的装置或测试中添加什么来创建一个也是完全注册用户(已确认等)的测试用户?
查看代码:
<% if user_signed_in? %>
<span id="loggedin">User is signed in</span>
User age is <span id="age"><%= current_user.age.to_s %></span>
<% end %>
测试代码:
test "should get index" do
sign_in :one
get :index
assert_response :success
assert_select 'span#loggedin', :count => 1
end
夹具:
one:
email: jez@example.com
age: 36
当我手动登录时,它在开发中工作正常,但我希望将其全部自动化 - 真正的测试点!!
最佳答案
Devise 3.2.0 之前的解决方案
我认为这可能是您正在寻找的内容:
User.new.send(:password_digest, 'password')
当盐为零时它起作用。
因此在你的装置中你可以这样做:
one:
email: 'some@user.com'
encrypted_password: <%= User.new.send(:password_digest, 'password') %>
Devise 版本 3.2.0 到 3.5.0 的解决方案
在 Devise 3.2.0 中,一个 method was created precisely for this purpose (@Inkling 更新)。对于这些版本,encrypted_password 应该像这样定义:
encrypted_password: <%= Devise.bcrypt(User, 'password') %>
哪里
User
是您的用户模型的类。请注意,这仅适用于使用默认加密算法 (bcrypt) 的情况。
Devise 3.5.1 及以上版本的解决方案
如 Katarzyna已指出:Device.bcrypt has been deprecated在 3.5.1 版本中。从那个版本开始,encrypted_password 应该像这样定义:
encrypted_password: <%= Devise::Encryptor.digest(User, 'password') %>
关于ruby-on-rails - 使用 Rails 和 Devise 进行功能测试。在我的固定装置中放什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4577737/