使用Rails和Devise进行function测试。 把什么放在我的灯具里?
嗨,我想对使用Devise和CanCan的Rails 3应用程序进行一些function测试。
在我的用户模型中,我有用户年龄,我想测试一个用户只能访问某个页面,如果它们是:
- 登录
- 超过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_password应该像这样定义:
encrypted_password: <%= Devise.bcrypt(User, 'password') %>
其中User
是您的用户模型的类。
请注意,这仅适用于使用默认加密算法(bcrypt)的情况。
Devise版本3.5.1及更高版本的解决方案
正如Katarzyna指出的那样:在版本3.5.1中已弃用Device.bcrypt 。 从该版本开始,encrypted_password应该像这样定义:
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
现在它有效。 如果在开发中生成用户并将数据粘贴到夹具中更容易,请发布。
再多一个提示。 这对我很有用:
它似乎是干燥和好的解决方案。
它对我有用。
我没有更改我的用户夹具上的任何内容,它是这样的:
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