2011-01-02 15 views
26

Witam Chcę przeprowadzić pewne testy funkcjonalne mojej aplikacji Rails 3, która używa Devise i CanCan.Testowanie funkcjonalne za pomocą Rails and Devise. Co umieścić w moich urządzeniach?

W moim modelu użytkownika mam wiek użytkowników, chcę sprawdzić, czy użytkownik może tylko odwiedzić pewną stronę, jeśli są to:

  1. Zalogowany
  2. Ponad 35

Widziałem w dokumencie Devise, że mogę użyć: * sign_in * i umieściłem to w moich testach i wygląda na to, że działa - test nie powoduje błędu, ponieważ mam:

include Devise::TestHelpers 

w moim * test_helper.rb *

Po wyjęciu, mój test powoduje błąd, ponieważ * sign_in * nie jest zdefiniowany. Więc nie jest to problem pomocniczy.

Po uruchomieniu testu i sprawdzeniu, czy span # loggedin ma jedno wystąpienie, test się nie powiódł, ponieważ wystąpiło 0 wystąpień. rozpiętość # loggedin pojawia się tylko jeśli user_signed_in *? *

Czego potrzebuję, aby umieścić w moich lamp lub testów, aby utworzyć użytkownika testowego, który jest także w pełni zarejestrowany użytkownik (potwierdzone etc)?

Zobacz Kod: Kod

<% 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 %> 

Test:

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

Oprawa:

one: 
email: [email protected] 
age: 36 

To działa dobrze w rozwoju, kiedy ręcznie zalogować, ale mam nadzieję, że go zautomatyzować wszystko - punkt testowania naprawdę !!

Odpowiedz

7

Rozwiązałem problem - nieprawidłowo logowałem użytkownika.

Mój test powinien zając przeczytać:

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

Działa to również i likwiduje linię kodu:

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

Moje rozumienie Oprawy brakowało ...

Ale wracając do pytanie - co umieścić w urządzeniach:

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 

Teraz działa. Jeśli jest łatwiejsze generowanie użytkownika w dev i wklejenie danych do urządzenia, prosimy pisać.

+1

Możesz użyć ERB w swoich urządzeniach, które pomogą ci ułatwić utrzymanie urządzeń. Można użyć narzędzi takich jak FactoryGirl zamiast (lub w połączeniu z), co ułatwi utrzymanie testów, ale znacznie spowolni testy. – iain

+0

Wiem o używaniu ERB w moich urządzeniach, ale jaki ERB potrzebuję do wygenerowania powyższego urządzenia? To było sedno mojego pytania - konkretnie, co muszę umieścić w moich urządzeniach? –

+1

Wiem, że to staruszek, ale natknąłem się na to, szukając pomocy w podobnym scenariuszu. Moje eksperymenty wskazują, że proste dodanie znacznika czasu "confirm_at" do Twojego urządzenia wydaje się zdziałać. – Chris

64

Rozwiązanie dla wersji wstępnej 3.2.0

myślę, że to może być to, czego szukasz:

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

Działa gdy sól jest zerowa.

A zatem w swoim urządzeniu można to zrobić:

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

Rozwiązanie dla wersji 3.2.0 do 3.5.0 opracować

Na opracować 3.2.0, A method was created precisely for this purpose (Aktualizacja @Inkling). Dla tych wersjach encrypted_password powinny być zdefiniowane tak:

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

gdzie User jest klasą modelu użytkownika.

Należy zauważyć, że ma to zastosowanie tylko w przypadku korzystania z domyślnego algorytmu szyfrowania (bcrypt).


opracować rozwiązanie dla wersji 3.5.1 i powyżej

As Katarzyna podkreślił: Device.bcrypt has been deprecated w wersji 3.5.1. Od tej wersji hasło zaszyfrowane powinno być zdefiniowane następująco:

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

Dobra aktualizacja @Inkling – ReggieB

+2

Jeśli jesteś początkującym użytkownikiem aplikacji i nie wiesz, jaki algorytm algorytmu Devise używa, sprawdź plik config/initializers/devise.rb dla ustawienia 'config.encryptor'. Inną wskazówką jest to, czy Gemfile zawiera 'gem 'devise-encryptable'' (który służy do wybierania cokolwiek innego niż bcrypt do szyfrowania). – pdobb

+1

Devise.bcrypt jest przestarzałe; użyj Devise :: Encryptor.digest – Katarzyna

1

To działa dla mnie.

niczego nie zmieni w moim urządzeniu użytkownika, to jest tak:

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

Ale zmieniłem test_helper.rb i dodałem to do klasy ActionController (to będzie działać dla wszystkich testów kontrolerów):

class ActionController::TestCase 
    include Devise::TestHelpers 

    setup do 
     sign_in users(:one) 
    end 
end 
Powiązane problemy