使用Rails和Devise进行功能测试.把什么放在我的灯具里?

Jez*_*dle 26 ruby-on-rails functional-testing fixtures devise

嗨,我想对使用Devise和CanCan的Rails 3应用程序进行一些功能测试.

在我的用户模型中,我有用户年龄,我想测试用户只能访问某个页面,如果他们是:

  1. 登录
  2. 超过35岁

我在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_pa​​ssword应该像这样定义:

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_pa​​ssword应该像这样定义:

encrypted_password: <%= Devise::Encryptor.digest(User, 'password') %>
Run Code Online (Sandbox Code Playgroud)

  • 如果您是应用程序的新用户并且不确定Devise正在使用哪种加密算法,请检查config/initializers/devise.rb文件以获取`config.encryptor`设置.另一个线索是,如果Gemfile包含`gem'depaise-encryptable'`(用于选择除bcrypt之外的任何其他内容进行加密). (2认同)

Jez*_*dle 7

我已经解决了问题 - 我错误地登录了用户.

我的测试应该是:

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)

现在它有效.如果在开发中生成用户并将数据粘贴到夹具中更容易,请发布.

  • 我知道这是一个老歌,但我偶然发现它在类似的情况下寻求帮助。我的实验表明,只需在您的装置中添加“confirmed_at”时间戳似乎就可以解决问题。 (2认同)