Utilizando fixtures com o devise

Se você leu meu último artigo sobre Fixtures vs Factories e utiliza o Devise, essa dica é útil para você.

Quando você utiliza o Factory Girl você não precisa se preocupar com o tratamento da senha para o Devise:

FactoryGirl.define do  
  factory :john, class: User do
    email 'john@example.com'
    password 'password'
    password_confirmation 'password'
  end
end  

Mas quando estamos utilizando fixtures, o rails não passa pelos accessors, callbacks e etc dos modelos, logo você precisa definir as fixtures com o dado pronto para o banco de dados.

Mas isso não é exatamente um problema porque podemos utilizar eRuby nas nossas fixtures:

Para o Devise anterior a versão 3.2.0:

john:  
  email: john@example.com
  encrypted_password: <%= User.new.send(:password_digest, 'password') %>

Para o Devise igual ou superior a 3.2.0 e anterior a 3.5.0:

john:  
  email: john@example.com
  encrypted_password: <%= Devise.bcrypt(User, 'password') %>

Para o Devise igual ou superior a 3.5.0:

john:  
  email: john@example.com
  encrypted_password: <%= Devise::Encryptor.digest(User, 'password') %>

Note que não é necessário mudar a extensão da sua fixture de .yml para .yml.erb porque o rails já pressupõe que você pode precisar do erb na sua fixture.

Referências:

  1. Functional testing with Rails and Devise. What to put in my fixtures?
  2. How to create fixtures (for a Devise user) as a yml.erb in rails (4.1.5)?
  3. Split out BCrypt hashing to make it reusable