Rails Fixtures with BCrypt

3.2k views Asked by At

I'm having a problem with fixtures for BCrypt password: my User model is both setup with has_secure_password and validates_presence_of :password.

The point is that BCrypt uses password and password_confirmation but in the schema there is only the password_digest field.

The fixture is complaining that the password field does not exists.

How can I avoid this?

Thank you

2

There are 2 answers

4
silverdr On

Apparently for performance reasons fixtures are being pushed to the database directly. That means that instead of password: you need password_digest: in your fixtures:

test_user:
  email: "[email protected]"
  password_digest: <%= BCrypt::Password.create('testpassword', cost: 5) %>

when using bcrypt based passwords with has_secure_password. As mentioned in the comments cost argument is optional. If you don't use it a sensible default will be used.

Update: in Rails 6 bcrypt is not available by default and needs to be explicitly added/required

0
Bruno Canongia On

I solved this problem with setup function on model test. We can define objects in setup and use it through the test file.

def setup
    @user = User.new
    @user.name = 'Brunoid'
    @user.email = 'brunoid@localhost'
    @user.phone = '(01)2345-6789'
    @user.cpf = '123.456.789-10'
    @user.password = 'segamastersystem'
    @user.password_confirmation = 'segamastersystem'
    @user.card = Card.first
end

test 'must validate' do
    assert @user.valid?
end
...