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

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

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

  1. 登录
  2. 超过35岁

我在Devise文档中看到我可以使用:* sign_in *并且我把它放在我的测试中它似乎工作 – 测试没有错误,因为我有:

include Devise::TestHelpers 

在我的* test_helper.rb *

当我拿出它时,我的测试会出错,因为* sign_in *没有定义。 所以这不是帮手问题。

当我运行测试并检查span#loggedin是否有一次出现时,测试失败,因为有0次出现。 span#loggedin仅出现* if user_signed_in?*

我需要在我的灯具或测试中创建一个也是完全注册用户(已确认等)的测试用户?

查看代码:

  User is signed in User age is   

测试代码:

 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 pre 3.2.0的解决方案

我想这可能就是你要找的东西:

 User.new.send(:password_digest, 'password') 

当盐为零时,它起作用。

因此,在您的灯具中,您可以这样做:

 one: email: 'some@user.com' encrypted_password: <%= User.new.send(:password_digest, 'password') %> 

设计版本3.2.0到3.5.0的解决方案

在Devise 3.2.0中, 为此目的创建了一种方法 (@Inkling update)。 对于这些版本,encrypted_pa​​ssword应该像这样定义:

 encrypted_password: <%= Devise.bcrypt(User, 'password') %> 

其中User是您的用户模型的类。

请注意,这仅适用于使用默认加密算法(bcrypt)的情况。


Devise版本3.5.1及更高版本的解决方案

正如Katarzyna指出的那样:在版本3.5.1中已弃用Device.bcrypt 。 从该版本开始,encrypted_pa​​ssword应该像这样定义:

 encrypted_password: <%= Devise::Encryptor.digest(User, 'password') %> 

我已经解决了问题 – 我错误地登录了用户。

我的测试应该是:

 test "should get index" do @user = users(:one) sign_in @user get :index assert_response :success assert_select 'span#loggedin', :count => 1 end 

这也有效并消除了一行代码:

 test "should get index" do sign_in users(:one) get :index assert_response :success assert_select 'span#loggedin', :count => 1 end 

我对夹具的理解缺乏……

但回到问题 – 要放置什么:

 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 

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

再多一个提示。 这对我很有用:

http://brandonhilkert.com/blog/managing-login-passwords-for-capybara-with-minitest-and-rails-fixtures/

它似乎是干燥和好的解决方案。

它对我有用。

我没有更改我的用户夹具上的任何内容,它是这样的:

 one: id: 1 name: MyString email: mystring@test.com group_id: 2 encrypted_password: <%= Devise.bcrypt(User, 'password') %> 

但我更改了我的test_helper.rb并将其添加到ActionController类中(这将适用于所有控制器测试):

 class ActionController::TestCase include Devise::TestHelpers setup do sign_in users(:one) end end