2017-05-12 1 views
0

Ich teste eine App in Rails und mit einem Fehler kann ich nicht herausfinden. Ich habe eine Tabelle namens "Familien" mit grundlegenden CRUD-Funktionalität. Wenn beim Erstellen einer neuen "Familie" in der neuen Ansicht der Titel nicht validiert wird, sollte die neue Ansicht erneut gerendert werden. Und es ist. Aber die URL ändert sich von "Familien/neu" zu "Familien". Die Ansicht und die URL stimmen nicht überein. Und mein Test scheitert als Ergebnis. Warum passiert das in meiner URL? Hier ist mein Test:Rails URL ändert sich ohne Änderung der Ansicht

require 'rails_helper' 

feature "Creating a family" do 

scenario "A user creates a family with invalid title" do 
    visit '/' 
    click_link 'Create Family' 
    click_button "Create" 
    expect(page.current_path).to eq(new_family_path) 
end 

end 

Hier sind die neuen und erstellen Aktionen in meinem Controller:

def new 
    @family = Family.new 
end 

def create 
    @family = Family.new(family_params) 
    if @family.save 
     redirect_to root_path 
    else 
     flash.now[:danger] = "There was a problem" 
     render :new 
    end 
end 

Familienmodell:

class Family < ApplicationRecord 

    validates :title, presence: true 

end 
+0

Die Antworten haben darauf hingedeutet, was Sie sehen, ist normales Verhalten von Schienen, jedoch sollten Sie niemals 'current_path' mit dem' eq'-Matcher verwenden, da es Capybaras Warten auf Wiederholungsversuche verhindert. Verwenden Sie stattdessen den 'have_current_path'-Matcher -' expect (page) .to have_current_path (new_family_path) '. Es erhöht die Teststabilität erheblich, wenn Sie zu einem JS-fähigen Treiber wechseln. –

Antwort

2

Genau hier:

def create 
    @family = Family.new(family_params) 
    if @family.save 
    redirect_to root_path 
    else 
    flash.now[:danger] = "There was a problem" 
    render :new 
    end 
end 

Wenn Sie die create Act treffen Sie sind POST in families. Sie dann render :new - die Sie bei der families URL mit der new teilweise zeigt.

Wenn Sie an der families/new URL am Ende wollen, müssen Sie etwas mehr wie tun:

def create 
    @family = Family.new(family_params) 
    if @family.save 
    redirect_to root_path 
    else 
    flash.now[:danger] = "There was a problem" 
    redirect_to new_family_path 
    end 
end 

Denken Sie daran: Rendering und Routing sind zwei verschiedene Dinge. Nur weil Sie render :new nicht implizieren, dass Sie an der new_families_path URL enden sollten. Zwei verschiedene Dinge.

1

Die Ansicht wird gerendert. Da Sie jedoch den POST-Endpunkt create und dann new gerendert haben, ist der POST-Endpunkt die URL.

Sie wollen wahrscheinlich nicht ändern, es zu new hier allerdings zu umleiten, weil Sie die in Ihrem @family Objekt gespeicherten Daten verlieren werde, die ich Ihnen auf dem Formular der Benutzereingabe anzuzeigen verwenden ich davon aus.

Ich würde Ihnen empfehlen, stattdessen zu überprüfen, dass das Formular erneut auf der Seite gerendert wird oder dass die Flash-Nachricht angezeigt wird, anstatt zu bestätigen, dass die URL /new ist.

Verwandte Themen