Test funzionali con Rails e Devise. Cosa mettere nei miei infissi?

Ciao, sto cercando di eseguire alcuni test funzionali della mia app Rails 3 che utilizza Devise e CanCan.

Nel mio modello Utente ho l’età degli utenti, voglio testare che un utente può visitare solo una determinata pagina se sono:

  1. Connesso
  2. Oltre 35

Ho visto nel documento Devise che posso usare: * sign_in * e l’ho messo nei miei test e sembra funzionare – il test non ha errori perché ho:

include Devise::TestHelpers 

nel mio * test_helper.rb *

Quando eseguo il test, il mio errore si verifica perché * sign_in * non è definito. Quindi non è un problema di aiuto.

Quando eseguo il test e controllo se span # loggato ha un’occorrenza, il test fallisce perché ci sono 0 occorrenze. span # loggato appare * se user_signed_in? *

Cosa devo inserire nei miei dispositivi o test per creare un utente di prova che sia anche un utente completamente registrato (confermato, ecc.)?

Visualizza codice:

  User is signed in User age is   

Codice di prova:

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

apparecchio:

 one: email: [email protected] age: 36 

Funziona bene nello sviluppo quando accedo manualmente ma spero di automatizzare tutto – il punto di testare davvero !!

Soluzione per Devise pre 3.2.0

Penso che questo potrebbe essere quello che stai cercando:

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

Funziona quando il sale è zero.

E quindi nel tuo dispositivo puoi fare questo:

 one: email: '[email protected]' encrypted_password: <%= User.new.send(:password_digest, 'password') %> 

Soluzione per Devise versioni dalla 3.2.0 alla 3.5.0

In Devise 3.2.0, è stato creato un metodo proprio per questo scopo (@Inkling update). Per queste versioni la password cifrata dovrebbe essere definita in questo modo:

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

dove User è la class del tuo modello utente.

Si noti che questo si applica solo se si utilizza l’algoritmo di crittografia predefinito (bcrypt).


Soluzione per Devise versioni 3.5.1 e successive

Come ha sottolineato Katarzyna : Device.bcrypt è stato deprecato nella versione 3.5.1. Da quella versione in poi, la password cifrata dovrebbe essere definita in questo modo:

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

Ho risolto il problema: stavo registrando l’utente in modo errato.

Il mio test dovrebbe leggere:

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

Questo funziona anche ed elimina una riga di codice:

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

Mancava la mia comprensione delle Fixtures …

Ma torniamo alla domanda: cosa mettere in infissi:

 one: email: [email protected] 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 

Ora funziona. Se è più facile generare un utente in dev e incollare i dati in un dispositivo, si prega di postare.

Solo un altro suggerimento. Questo ha funzionato alla grande per me:

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

E sembra essere ASCIUTTO e bella soluzione.

Funziona per me.

Non ho cambiato nulla sul mio dispositivo utente, è come questo:

 one: id: 1 name: MyString email: [email protected] group_id: 2 encrypted_password: <%= Devise.bcrypt(User, 'password') %> 

Ma ho cambiato il mio test_helper.rb e l’ho aggiunto alla class ActionController (questo funzionerà per tutti i test dei controller):

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