2016-06-13 6 views
6

Według Rails Edge Guide wszystko ActionDispatch :: IntegrationTest HTTP żądania podjęcia opcjonalnych argumentów nazwanych kluczowe:Nie można ustawić skrót sesji w szynach testu 5 kontrolera

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

Wielki. Teraz, mam następujący kod w teście Kontroler:

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 

I kiedy go uruchomić, moja próba nie i widzę następujące ostrzeżenie Deprecation:

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

Tak oczywiście to szyny nie pozwalają mi przekazać argumentu słowa kluczowego o nazwie sesja.

Ponadto, zarówno starych metod ustawiania sesji w teście funkcjonalnym nie działa albo:

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

NoMethodError: undefined method `session' for nil:NilClass

I to nie zbyt:

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

Haszysz sesji po prostu zignorowano i pojawiło się ostrzeżenie o wycofywaniu się z szyny przyjmującej tylko 4 różne nazwane argumenty.

Czy ktoś ma takie problemy z Railsami 5.rc1?

+0

Według przykładu 'dostać posta: POST_URL, params: {id: 12}, sesja: {user_id: 5}' drugi argument jest * params *, 'get '/ login', sesja: {user_id: users (: stephen) .id}' ale przekazujesz sesję *, czy próbowałeś 'get '/ login', params: {}, session: { user_id: users (: stephen) .id} '? –

+0

@ Зелёный argumenty są całkowicie opcjonalne, a kolejność jest nieistotna, i tak, wypróbowałem twój pomysł, i to nie rozwiązało problemu – stephenmurdoch

+0

To dziwne, ponieważ działa to płynnie w moich testach –

Odpowiedz

1

Spróbuj ustawić session przez open_session metody

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 Odświeżyłem moją odpowiedź, czy mógłbyś spróbować? – itsnikolay

+0

Dzięki @itsnikolay wygląda na to, że jest błąd w Railsach, który moja odpowiedź wyjaśnia nieco więcej. – stephenmurdoch

1

Okazuje się, że testy kontrolera teraz dziedziczą ActionDispatch::IntegrationTest domyślnie i kodu handles the behaviour I wanted siedzi w ActionController::TestCase.

Więc poprawka do teraz jest wykonanie następujących czynności:

1 - modyfikować test kontrolera do dziedziczą ActionController :: TestCase

class SessionsControllerTest < ActionController::TestCase 

2 - modyfikować wszystkie żądania http wzywa do korzystania symbolizowany nazwy akcji zamiast adresów URL:

# so change this 
get login_url 

# to this 
get :new 

I to powinieneś być w stanie korzystać z nowego kw_args w swoich żądań tak:

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

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

Mam zamiar otworzyć problem na Github później, ponieważ wyobrażam sobie, że to zachowanie nie jest zamierzone. Dzięki @BoraMa dla prowadząc mnie do odpowiedzi

+2

Stworzyłem problem dla tego [tutaj] (https://github.com/szyny/szyny/wydania/25394) – stephenmurdoch

0

myślę, że można zrobić jak to:

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

W Rails 5 nie jest już możliwe, aby uzyskać dostęp do sesji w testach Kontroler: http://blog.napcs.com/2016/07/03/upgrading-rails-5-controller-tests/. Sugestia polega na uzyskaniu dostępu do metody kontrolera, która ustawi dla ciebie odpowiednią wartość sesji.Ten komentarz pokazy i przykładem tego, jak można obejść to ograniczenie: 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 
    ..