2012-05-04 4 views
1

Вот мой тест:Как получить Придумайте сеанс # создать тест, чтобы пройти

требует «test_helper»

class SessionsControllerTest < ActionController::TestCase 
    setup do 
    @request.env["devise.mapping"] = Devise.mappings[:user] 
    @u = Factory :user, :password => :mypass, :password_confirmation => :mypass 
    end 
    test 'log in page loads' do 
    get :new 
    assert :success 
    end 
    test 'log in with devise password' do 

    post :create, :user => {:email => @u.email, :password => 'mypass'} 
    ap session 
    end 

end 

дает этот вывод, показывая, что вход не удался:

Loaded suite test/functional/sessions_controller_test 
Started 
.{ 
     "action" => "create", 
     "locale" => "en", 
    "controller" => "sessions", 
      "user" => { 
     "password" => "mypass", 
      "email" => "[email protected]" 
    } 
} 
{ 
    "flash" => { 
     :alert => "Invalid email or password." 
    } 
} 
. 
Finished in 0.49123 seconds. 

Это моя сессия контроллера:

#this is an extension of the devise controller for sessions 
class SessionsController < Devise::SessionsController 
    before_filter :set_title_h1, :only => :new 
    before_filter :debug, :only => :create 
    before_filter :old_password_system_fix, :only => :create 

    private 

    def set_title_h1 
    @layout[:show_h1] = false 
    title 'Sign in Or Register' 
    end 
    def after_sign_in_path_for(resource) 
    #override Devise default sign in path /opt/local/lib/ruby/gems/1.8/gems/devise-1.1.2/lib/devise/controllers/helpers.rb 
    #edit_user_registration_path 
    '/en/main/index' #forces locale to be defined 
    end 

    def after_sign_out_path_for(resource) 
    #override Devise default sign out path /opt/local/lib/ruby/gems/1.8/gems/devise-1.1.2/lib/devise/controllers/helpers.rb 
    main_index_path 
    end 
    def old_password_system_fix 
    #purpose is to bring old users into the new system by setting their old password to the new format 

    require 'digest/md5' 

    email = params[:user][:email] 
    pw = params[:user][:password] 

    #get user 
    u = User.find_by_email email 

    return if u.nil? 

    #if they don't have a devise-style pw, authenticate with old 
    if u.encrypted_password.blank? && u.old_password.present? 

     #if [params pw] == md5 [old pw] then create devise-style pw & salt, store it, and let them through to devise auth action 
     if u.old_password == Digest::MD5.hexdigest(pw) 

     set_devise_style_pw(u, pw) 

     #if no match, give "invalid email or pw" message. 
     else 
     #flash[:notice] = "Sign in failed." 
     flash[:notice] = t 'devise.failure.invalid' 
     #render :new 
     redirect_to new_user_session_path 
     end 

    end 
    end 
    def debug 
    ap params 
    end 
end 

Что мне не хватает и как я могу протестировать новый сеанс с помощью функционального теста?

+1

Я не эксперт (у меня есть свой собственный тестовый вопрос, который висит там), но, похоже, есть помощник 'sign_in', который вы можете попробовать, вместо 'post'ing. См. (Если вы еще этого не сделали): https://github.com/plataformatec/devise/wiki/How-To:-Controllers-and-Views-tests-with-Rails-3-%28and-rspec% 29 –

+1

sign_in работает, но он обходит контроллер сеанса. Мне действительно нужно протестировать контроллер сеанса, потому что он имеет нестандартное действие create, которое переопределяет значение Devise. Но я не могу заставить эту вещь фактически войти в систему даже с действительным пользователем ... – pixelearth

ответ

0

Оказывается, вы должны использовать интеграционный тест, а не функциональный тест. Не спрашивайте меня, почему ...

Смежные вопросы