Jez*_*dle 26 ruby-on-rails functional-testing fixtures devise
嗨,我想对使用Devise和CanCan的Rails 3应用程序进行一些功能测试.
在我的用户模型中,我有用户年龄,我想测试用户只能访问某个页面,如果他们是:
我在Devise文档中看到我可以使用:*sign_in*并且我把它放在我的测试中它似乎工作 - 测试没有错误,因为我有:
include Devise::TestHelpers
Run Code Online (Sandbox Code Playgroud)
在我的*test_helper.rb*
当我拿出它时,我的测试会出错,因为*sign_in*没有定义.所以这不是帮手问题.
当我运行测试并检查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 %>
Run Code Online (Sandbox Code Playgroud)
测试代码:
test "should get index" do
sign_in :one
get :index
assert_response :success
assert_select 'span#loggedin', :count => 1
end
Run Code Online (Sandbox Code Playgroud)
夹具:
one:
email: jez@example.com
age: 36
Run Code Online (Sandbox Code Playgroud)
当我手动登录时,它在开发中工作正常,但我希望自动化它 - 真正的测试点!
Reg*_*ieB 66
Devise pre 3.2.0的解决方案
我想这可能就是你要找的东西:
User.new.send(:password_digest, 'password')
Run Code Online (Sandbox Code Playgroud)
当盐为零时,它起作用.
因此,在您的夹具中,您可以这样做:
one:
email: 'some@user.com'
encrypted_password: <%= User.new.send(:password_digest, 'password') %>
Run Code Online (Sandbox Code Playgroud)
设计版本3.2.0到3.5.0的解决方案
在Devise 3.2.0中,为此目的创建了一种方法(@Inkling update).对于这些版本,encrypted_password应该像这样定义:
encrypted_password: <%= Devise.bcrypt(User, 'password') %>
Run Code Online (Sandbox Code Playgroud)
User您的用户模型的类在哪里.
请注意,这仅适用于您使用默认加密算法(bcrypt)的情况.
Devise版本3.5.1及更高版本的解决方案
正如Katarzyna指出的那样:在版本3.5.1中已弃用Device.bcrypt.从该版本开始,encrypted_password应该像这样定义:
encrypted_password: <%= Devise::Encryptor.digest(User, 'password') %>
Run Code Online (Sandbox Code Playgroud)
我已经解决了问题 - 我错误地登录了用户.
我的测试应该是:
test "should get index" do
@user = users(:one)
sign_in @user
get :index
assert_response :success
assert_select 'span#loggedin', :count => 1
end
Run Code Online (Sandbox Code Playgroud)
这也有效并消除了一行代码:
test "should get index" do
sign_in users(:one)
get :index
assert_response :success
assert_select 'span#loggedin', :count => 1
end
Run Code Online (Sandbox Code Playgroud)
我对夹具的理解不足......
但回到这个问题 - 在灯具中放入什么:
one:
email: jez@example.com
encrypted_password: $2a$10$PoBe1MvkoGJsjMVTEjKqgeBUp.xdfzWoiDjBzQhtLAj16NqIa2fOy
password_salt: $2a$10$PoBe1MvkoGJsjMVTEjKqge
reset_password_token: nil
remember_token: nil
remember_created_at: nil
sign_in_count: 1
current_sign_in_at: 2011-01-02 08:31:23
last_sign_in_at: 2011-01-02 08:31:23
current_sign_in_ip: 127.0.0.1
last_sign_in_ip: 127.0.0.1
confirmation_token: nil
confirmed_at: 2011-01-02 08:31:23
confirmation_sent_at: 2011-01-02 08:30:59
failed_attempts: 0
unlock_token: nil
locked_at: nil
authentication_token: nil
created_at: 2011-01-02 08:30:59
updated_at: 2011-01-02 08:31:23
age: 36
Run Code Online (Sandbox Code Playgroud)
现在它有效.如果在开发中生成用户并将数据粘贴到夹具中更容易,请发布.
| 归档时间: |
|
| 查看次数: |
9662 次 |
| 最近记录: |