2016-05-06 7 views
1

Mit Capybara/Rspec Schienen zu testen. Möchten Sie überprüfen, ob der aktuelle Pfad korrekt mit der ID generiert wurde, aber nicht auf die erstellte Kontakt-ID zugreifen kann.Capybara Rspec Rails erhalten ID für Pfad

Beispiel Erwartung: localhost: 3000/Kontakte/27

Beispiel erhielt: localhost: 3000/Kontakte/

-Code base:

feature 'contacts' do 

    before do 
     visit '/' 
     click_link 'Sign up' 
     fill_in 'Email', with: '[email protected]' 
     fill_in 'Password', with: '123456' 
     fill_in 'Password confirmation', with: '123456' 
     click_button 'Sign up' 
     click_link 'Add a contact' 
     fill_in 'Firstname', with: 'John' 
     fill_in 'Surname', with: 'Jones' 
     fill_in 'Email', with: '[email protected]' 
     fill_in 'Phone', with: '223344' 
     attach_file('contact[image]', Rails.root + 'spec/mouse1.jpeg') 
     click_button 'Create Contact' 
    end 

context 'view a contact' do 
    scenario 'click contact to view details' do 
     click_link('Mouse1') 
     expect(page).to have_content 'John Jones 223344 [email protected]' 
     expect(page).to have_xpath("//img[contains(@src, \/html/body/a[2]/img\)]") 
     expect(page).to have_current_path(contact_path("#{@contact.id}")) 
    end 
    end 

überraschte die Interpolation nicht gearbeitet hat, und wirft Fehler undefinierte Methode 'ID' für NilClass mit dem folgenden. Natürlich kann es nicht auf die ID zugreifen.

auch versucht, es mit Auslagern @p = Contact.find_by_id(params[:id]) dann in der Interpolation in den @p vorbei. Aber wirft Fehler undefined local variable or method params

Irgendwelche Ideen/Gedanken?

+0

Wo ist eine Variable '@ contact.id' definiert? –

+0

hi @ Зелёный in der contacts_controller.rb. – blastoff

+0

Warum denken Sie, was Sie auf eine _instance-Variable ('@ contact') _ vom Controller in Ihrem Feature-Test zugreifen können? Du kannst nicht. –

Antwort

3

Sie können nicht innerhalb eines Funktionstests auf die Variablen der Controller-Instanz zugreifen. Sie können jedoch auf die Datenbank zugreifen, und da Sie nur einen Ansprechpartner in diesem Test erstellt haben erste oder letzte funktionieren sollte -

expect(page).to have_current_path(contact_path("#{Contact.last.id}")) 

Das, gesagt einen Benutzer anmelden und die Schaffung der Kontakt über die Benutzeroberfläche, wenn der Test Es ist nur wenig sinnvoll, nur zu prüfen, ob ein vorhandener Kontakt angezeigt werden kann, wenn Sie einfach die Datenbankdatensätze für Ihre Feature-Tests erstellen können. Wahrscheinlich möchten Sie etwas in der Linie von FactoryGirl sehen, um Ihre Feature-Test-Objekte zu erstellen.