2016-06-13 17 views
6

Secondo il Rails Edge Guide tutti ActionDispatch :: IntegrationTest richieste HTTP prendono argomenti chiave con nome opzionali:Impossibile impostare sessione di hash in Rails prova 5 regolatore

get post_url, params: { id: 12 }, session: { user_id: 5 }

Grande. Ora, ho il seguente codice in un test di controllo:

test 'should redirect from login page if user is logged in' do 
    get '/login', session: { user_id: users(:stephen).id } 
    assert_redirected_to root_url, 'Expected redirect to root' 
end 

E quando l'eseguo, il mio test fallisce e vedo il seguente avviso deprecazione:

ActionDispatch::IntegrationTest HTTP request methods will accept only 
the following keyword arguments in future Rails versions: 
params, headers, env, xhr 

Così, ovviamente si tratta di I binari non mi permettono di passare un argomento di parole chiave chiamato sessione.

Inoltre, entrambi i vecchi metodi di impostazione della sessione in un test funzionale non funzionano più o:

test "some thing" do 
    session[:user_id] = users(:stephen).id 
    # etc 
end 

NoMethodError: undefined method `session' for nil:NilClass

E questo non troppo:

test "some thing" do 
    get '/login', nil, nil, { user_id: users(:stephen).id } 
    # etc 
end 

L'hash di sessione è appena ignorato e appare l'avviso di deprecazione sui binari che accetta solo 4 diversi argomenti con nome.

Qualcun altro ha questo tipo di problemi con Rails 5.rc1?

+0

Secondo l'esempio 'ottengono POST_URL, params: {id: 12}, sessione: {user_id: 5}' il secondo argomento è * params *, 'get '/ login', sessione: {user_id: users (: stephen) .id}' ma passi la * session *, hai provato 'get '/ login', params: {}, session: { user_id: users (: stephen) .id} '? –

+0

@ Зелёный gli argomenti sono tutti completamente opzionali, e l'ordine non è importante, e sì ho provato la tua idea, e non risolve il problema – stephenmurdoch

+0

Questo è strano, perché funziona senza problemi nei miei test –

risposta

1

Prova impostato session attraverso open_session metodo

open_session do |sess| 
    sess.get "/login", user_id: users(:stephen).id 
    assert_redirected_to root_url, 'Expected redirect to root' 
end 
+0

'params! = Session' –

+0

@stephenmurdoch Ho aggiornato la mia risposta, potresti provarla – itsnikolay

+0

Grazie a @itsnikolay sembra che ci sia un bug in Rails che la mia risposta spiega un po 'di più. – stephenmurdoch

1

Risulta che i test del controller ora ereditano da ActionDispatch::IntegrationTest di default e il codice che handles the behaviour I wanted siede in ActionController::TestCase.

Quindi la correzione per ora è quello di effettuare le seguenti operazioni:

1 - modificare il test del controller di ereditare da ActionController :: TestCase

class SessionsControllerTest < ActionController::TestCase 

2 - modificare tutta la vostra richiesta http chiamate da usare nomi simboleggiate azione, invece di URL:

# so change this 
get login_url 

# to this 
get :new 

E allora si dovrebbe essere in grado di utilizzare la nuova kw_args nelle vostre richieste in questo modo:

# now this will work fine 
get :new, session: { user_id: user.id } 

# and so will this 
session[:user_id] = user.id 

Ho intenzione di aprire un problema su github in seguito, poiché immagino che questo comportamento non sia inteso. Grazie a @BoraMa per me che conduce alla risposta

+2

Ho creato un problema per questo [qui] (https://github.com/rotaie/rotaie/temi/25394) – stephenmurdoch

0

Penso che si può fare come questo:

delete cart_url(@cart), params: { 'session' => { :cart_id => @cart.id }} 
6

In Rails 5 non è più possibile accedere sessione nei test del controller: http://blog.napcs.com/2016/07/03/upgrading-rails-5-controller-tests/. Il suggerimento è di accedere al metodo del controller che imposterà il valore di sessione appropriato per te.Questo commento spettacoli e l'esempio di come si potrebbe aggirare questa limitazione: https://github.com/rails/rails/issues/23386#issuecomment-192954569

# helper method 
    def sign_in_as(name) 
    post login_url, params: { sig: users(name).perishable_signature) 
    end 

class SomeControllerTest 
    setup { sign_in_as 'david' } 

    test 'the truth' do 
    .. 
Problemi correlati