2016-04-11 11 views
2

Ich habe ein Problem mit meiner Sitzung gespeichert return_to URL in meinen Integrationstests.Sitzungsvariablen können nicht im Integrationstest in Schienen verwendet werden

Weil mein Controller kann aus verschiedenen Orten greift sein speichere ich den Referer in der Sitzung auf die neue Aktion und umleiten, um es in meiner Aktion erstellen.

cards_controller.rb: 
class CardsController < ApplicationController 
... 
    def new 
    @card = current_user.cards.build 
    session[:return_to] ||= request.referer 
    end 

    def create 
    @card = current_user.cards.build(card_params) 
    if @card.save 
     flash[:success] = 'Card created!' 
     redirect_to session.delete(:return_to) || root_path 
    else 
     render 'new', layout: 'card_new' 
    end 
    end 
... 
end 

Da ich nur die Aktion in meinem Test erstellen verwenden mag ich das Session-Variable in dem Integrationstest setzen, wie ich in meinem Unit-Test tun, aber es funktioniert nicht. Ich werde immer zum Root-Pfad weitergeleitet.

cards_interface_test.rb: 
class CardsInterfaceTest < ActionDispatch::IntegrationTest 
    test 'cards interface should redirect after successful save' do 
    log_in_as(@user) 
    get cards_path 
    assert_select 'a[aria-label=?]', 'new' 
    name = "heroblade" 
    session[:return_to] = cards_url 
    assert_difference 'Card.count', 1 do 
     post cards_path, card: { name: name, icon: 'white-book', color: 'indigo', contents: 'subtitle | Rogue feature'} 
    end 
    assert_redirected_to cards_url 
    follow_redirect! 
    assert_match name, response.body 
    assert_select 'td', text: name 
    end 
end 

Der Test schlägt auf der assert_redirected_to Linie fehl.

Ich versuchte zuerst get new_card_path zu rufen, aber machte keinen Unterschied und jetzt bin ich ein bisschen verloren. Ich weiß nicht, ob das grundsätzlich funktionieren sollte, aber ich habe einen kleinen Fehler gemacht oder versucht, etwas komplett gegen die Best Practices zu unternehmen und sollte alle meine Interface-Tests so umgestalten, dass sie Selenium oder ähnliche Tools verwenden.

ich auch versucht, die Session-Variablen als Teil der Anforderung, wie die Schienen Führung bereitzustellen, beschreibt für Funktionstests ohne Effekte:

post cards_path, {card: { name: name, icon: 'white-book', color: 'indigo', contents: 'subtitle | Rogue feature' }}, {'return_to' => cards_url} 

Antwort

1

Ich weiß nicht manuell, wenn Session Einstellung in Integration möglich ist, Tests (raten eher nicht) aber sollten Sie in der Lage sein, den Referer einzustellen, weil es nur ein normaler HTTP-Header ist. Header können als 3rd parameter an den Request-Methoden-Helper (get etc.) in Integrationstests übergeben werden.

Also, ich denke, Sie sollten zuerst die new Aktion mit dem Referer-Header gesetzt (so dass es in die Sitzung kommt) und dann die create Aktion sollte einschließlich der Umleitung funktionieren.

class CardsInterfaceTest < ActionDispatch::IntegrationTest 
    test 'cards interface should redirect after successful save' do 
    log_in_as(@user) 

    # visit the 'new' action as if we came from the index page 
    get new_card_path, nil, referer: cards_url 

    assert_difference 'Card.count', 1 do 
     post cards_path, card: { name: name, icon: 'white-book', color: 'indigo', contents: 'subtitle | Rogue feature'} 
    end 
    assert_redirected_to cards_url 
    # ... 
    end 
end 

Zuerst versuchen wir, die new Aktion mit dem Referer-Set erhalten, als ob wir von der Indexseite kamen (so dass der Referer in die session bekommen). Der Rest des Tests bleibt gleich.

+0

Gearbeitet, thx. Ich habe nicht darüber nachgedacht, dass ich den Referer explizit einstellen musste. –

Verwandte Themen