2011-01-02 8 views
26

Ciao, sto cercando di eseguire alcuni test funzionali della mia app Rails 3 che utilizza Devise e CanCan.Test funzionali con Rails e Devise. Cosa mettere nei miei infissi?

Nel mio modello User ho l'età degli utenti, voglio provare che un utente può visitare solo una certa pagina, se sono:

  1. loggato
  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, viene visualizzato un errore perché * sign_in * non è definito. Quindi non è un problema di aiuto.

Quando si esegue il test e si verifica se span # registrato ha un evento il test ha esito negativo perché sono presenti 0 occorrenze. arco # loggedin appare solo * Se user_signed_in? *

cosa ho bisogno di mettere nei miei infissi o le prove per creare un utente di prova che è anche un utente completamente sottoscritto (confermato, ecc)?

Visualizza codice: Codice

<% if user_signed_in? %> 
    <span id="loggedin">User is signed in</span> 
    User age is <span id="age"><%= current_user.age.to_s %></span> 
<% end %> 

prova:

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

Fixture:

one: 
email: [email protected] 
age: 36 

Funziona bene in fase di sviluppo quando faccio il login manualmente, ma spero di automatizzare tutto - il punto di testare davvero !!

risposta

7

Ho risolto il problema - stavo registrando l'utente in modo errato.

Il mio test dovrebbe lepre 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 

mia comprensione di Fixtures mancava ...

Ma torniamo al la 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.

+1

Puoi utilizzare ERB nei tuoi dispositivi, che ti aiuteranno a rendere i dispositivi più facili da mantenere. Potresti usare strumenti come FactoryGirl invece che (o in combinazione con) dispositivi, questo renderà i tuoi test più facili da mantenere, ma rallenterà significativamente i test. – iain

+0

Conosco l'utilizzo di ERB nei miei dispositivi, ma quale ERB è necessario per generare l'apparecchiatura sopra? Questo era il cuore della mia domanda - in particolare, cosa devo inserire nei miei dispositivi? –

+1

So che questo è un vecchio, ma mi sono imbattuto in esso cercando aiuto in uno scenario simile. I miei esperimenti indicano che aggiungere semplicemente un timestamp 'confirmed_at' al tuo dispositivo sembra fare il trucco. – Chris

64

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 è pari a zero.

E quindi nel vostro apparecchio si può fare questo:

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

soluzione per le versioni Devise 3.2.0 alla versione 3.5.0

A Devise 3.2.0, un method was created precisely for this purpose (@Installazione di Inchling). Per queste versioni l'encrypted_password dovrebbe essere definita in questo modo:

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

dove User è la classe del modello utente.

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


soluzione per le versioni 3.5.1 e Devise sopra

Come Katarzyna ha sottolineato: Device.bcrypt has been deprecated 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') %> 
+3

Nice update @Inkling – ReggieB

+2

Se sei nuovo in un'app e non sei sicuro di quale algoritmo di crittografia viene usato da Devise, controlla il file config/initializers/devise.rb per l'impostazione 'config.encryptor'. Un altro indizio è se il Gemfile include 'gem 'devise-encryptable'' (che viene usato per selezionare qualcosa di diverso da bcrypt per la crittografia). – pdobb

+1

Devise.bcrypt è deprecato; usa Devise :: Encryptor.digest – Katarzyna

1

Funziona per me.

Non ho cambiato nulla sul mio dispositivo dell'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 ho aggiunto questo alla classe ActionController (questo lavoro per tutti i test controller):

class ActionController::TestCase 
    include Devise::TestHelpers 

    setup do 
     sign_in users(:one) 
    end 
end